有人可以解释这种行为吗?
在下面给出一个实体 MyEntity ,以下代码
EntityManagerFactory emf = Persistence.createEntityManagerFactory("greetingPU");
EntityManager em = emf.createEntityManager();
MyEntity e = new MyEntity();
e.setMessage1("hello"); e.setMessage2("world");
em.getTransaction().begin();
em.persist(e);
System.out.println("-- Before commit --");
em.getTransaction().commit();
System.out.println("-- After commit --");
导致输出指示EclipseLinks EntityManager或其关联对MyEntity的“setter”方法的多次调用。这种行为是期待的吗?可能出于某些内部表现或结构原因?其他JPA实现是否显示相同的行为?
-- Before commit --
setId
setId
setMessage1
setMessage2
setId
setMessage1
setMessage2
-- After commit --
似乎有两种不同的重新分配。首先,Id的初始集。第二,整个实体的两个连续设置。 调试显示给定“setter”的所有调用都与其参数具有相同的对象。
@Entity
public class MyEntity {
private Long id;
private String message1;
private String message2;
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE)
public Long getId(){ return id; }
public void setId(Long i) {
System.out.println("setId");
id = i;
}
public String getMessage1() { return message1; }
public void setMessage1(String m) {
message1 = m;
System.out.println("setMessage1");
}
public String getMessage2() { return message2; }
public void setMessage2(String m) {
message2 = m;
System.out.println("setMessage2");
}
}
答案 0 :(得分:1)
EclipseLink必须调用setId一次才能在托管实体实例中设置生成的ID。它还将创建一个实例并为共享缓存设置其值,解释另一个setId和set values调用。如果您不使用编织,因为EntityManager仍然存在,EclipseLink还将创建一个备份实例,用于比较未来的更改 - 在事务提交后仍需要跟踪对托管实体的任何更改。
如果不希望这样做,则编织允许使用属性更改跟踪,以便不需要备份副本来跟踪更改。您也可以关闭共享缓存,但除非遇到性能或陈旧数据问题,否则不建议这样做。