1

在 JSF 中使用 EJB 和 JPA 构建 Web 应用程序 我想知道如何获取实体的修改字段。

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

@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 的方法“编辑”中:

@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)编辑名字字段 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 查询数据库?

4

1 回答 1

3

看,

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

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

于 2013-04-04T13:17:02.873 回答