避免让JPA自动持久化对象

时间:2012-04-24 18:21:25

标签: java spring jpa

有没有办法避免让JPA自动保留对象?

我需要使用第三方API,我必须从/向它提取/推送数据。我有一个负责接口API的类,我有一个这样的方法:

public User pullUser(int userId) {
    Map<String,String> userData = getUserDataFromApi(userId);
    return new UserJpa(userId, userData.get("name"));
}

UserJpa类的位置:

@Entity
@Table
public class UserJpa implements User
{
    @Id
    @Column(name = "id", nullable = false)
    private int id;

    @Column(name = "name", nullable = false, length = 20)
    private String name;

    public UserJpa() {
    }

    public UserJpa(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

当我调用方法(例如pullUser(1))时,返回的用户将自动存储在数据库中。我不希望这种情况发生,是否有避免它的解决方案?我知道一个解决方案可能是创建一个实现User的新类并在pullUser()方法中返回此类的实例,这是一个很好的做法吗?

谢谢。

3 个答案:

答案 0 :(得分:6)

新建的UserJpa实例未在pullUser中保留。我还假设getUserDataFromApi中没有一些奇怪的实现实际上持久存在同样的id。

在您的情况下,实体管理器对UserJPA的新实例一无所知。通常,实体通过合并/持久调用或级联合并/持久操作持久化。在代码库中检查其他地方。

答案 1 :(得分:0)

新实体在JPA中保留的唯一方法是明确调用EntityManager的{​​{1}}或persist()方法。在代码中查找对其中任何一个的调用,这是持久化操作发生的点,并重构代码以在其他地方执行持久性。

答案 2 :(得分:0)

通常,JPA对象是托管对象,这些对象在事务完成时以及在第一级缓存之前将其更改反映到数据库中,显然这些对象需要首先进行管理。

我真的认为最好的做法是使用DTO对象来处理数据传输,然后仅仅为了持久性目的使用实体,这样就会更有凝聚力和更低的耦合,这不是他们鼻子的对象所在它不应该。

希望它有所帮助。

相关问题