3

有什么办法可以避免让 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()是一个好习惯吗?

谢谢你。

4

3 回答 3

6

新创建的 UserJpa 实例不会保留在 pullUser 中。我还假设 getUserDataFromApi 中没有一些奇怪的实现实际上为相同的 id 持久化了一些东西。

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

于 2012-04-24T18:41:15.940 回答
0

在 JPA 中持久化新实体的唯一方法是显式调用EntityManager'spersist()merge()方法。在您的代码中查找对其中任何一个的调用,这就是持久操作发生的地方,然后重构代码以在其他地方执行持久性。

于 2012-04-24T18:38:45.810 回答
0

通常 JPA 对象是托管对象,这些对象在事务完成时将它们的更改反映到数据库中,然后在一级缓存上,显然这些对象首先需要成为托管对象。

我真的认为最佳实践是使用 DTO 对象来处理数据传输,然后将实体仅用于持久性目的,这样它会更有凝聚力和更低的耦合,这不是它不应该有鼻子的对象。

希望能帮助到你。

于 2012-04-24T18:41:21.527 回答