JPA:修改后的分离实体与原始实体之间的差异

时间:2013-04-03 16:58:42

标签: jpa ejb jpa-2.0 eclipselink ejb-3.1

使用EJB& amp;构建Web应用程序JSF中的JPA我想知道如何获得实体的修改字段。

让我们举一个简单的例子:

@Entity
@Table
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Integer id;

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

    // ...
}

现在在我的EJB方法'edit'中:

@Singleton
public class UserService {

    @PersistenceContext
    protected EntityManager em;

    public void edit(User user) {
        this.em.merge(user);
    }
}

我想知道改变了什么,例如说“用户首先被命名为'john'他现在是'johny'!”。

我正在做的步骤:

1)搜索ID为1的用户 2)显示表单(作为html)帮助JSF(绑定由JSF管理) 3)编辑firstname字段 4)表单已提交,我正在编辑用户对象 5)在坚持之前,我想与旧的比较 6)问题是我无法使用this.em.find(1);获取它,因为我已经得到它

我试过了:

@Singleton
public class UserService {

    @PersistenceContext
    protected EntityManager em;

    public void edit(User user) {
        System.out.println("USER 1 : " + user.getFirstname());
        User u2 = this.em.find(User.class, 1);
        System.out.println("USER 1 : " + user.getFirstname());
        System.out.println("USER 2 : " + user.getFirstname());
        this.em.merge(user);
        System.out.println("USER 1 : " + user.getFirstname());
        System.out.println("USER 2 : " + user.getFirstname());
    }
}

我得到了:

USER 1 : johny
USER 1 : johny
USER 2 : johny
USER 1 : johny
USER 2 : johny

我很确定JPA在内部知道修改了什么,是否有一种神奇的方式,或者我是否应该保留自己的旧值或者使用SQL自己查询数据库?

1 个答案:

答案 0 :(得分:3)

请参阅,

http://wiki.eclipse.org/EclipseLink/FAQ/JPA#How_to_access_what_changed_in_an_object_or_transaction.3F

但您也可以创建一个不在同一事务/持久性上下文中的新EntityManager,因此将返回当前在数据库中的数据。 (请注意,这可能与开始时的情况不同,因为其他用户可能已经更改了数据)。