有人可以解释这种行为吗?
给定下面的实体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的初始集合。第二,整个实体的两个连续设置。
调试显示,给定“设置者”的所有调用与其参数都具有相同的对象。
@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");
}
}
最佳答案
您正在使用编织吗? http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Advanced_JPA_Development/Performance/Weaving
EclipseLink必须调用一次setId才能在管理实体实例中设置生成的ID。它还将创建一个实例并为共享缓存设置其值,解释另一个setId和set values调用。如果您不使用编织,因为EntityManager仍然存在,则EclipseLink还将创建一个备份实例以用于比较将来的更改-仍需要跟踪事务提交后对受管实体的任何更改。
如果不希望这样做,则可以使用编织来代替使用属性更改跟踪,这样就不需要备份副本来跟踪更改。您也可以关闭共享缓存,但是除非遇到性能问题或过时的数据问题,否则不建议这样做。