使用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自己查询数据库?
答案 0 :(得分:3)
请参阅,
但您也可以创建一个不在同一事务/持久性上下文中的新EntityManager,因此将返回当前在数据库中的数据。 (请注意,这可能与开始时的情况不同,因为其他用户可能已经更改了数据)。