我正在使用 EclipseLink 2.4.1 和 JPA 2.0。在我的示例中,我有以下类定义:
@Entity
public class Shepard {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@OneToMany(mappedBy = "shepard", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<Sheep> sheeps;
public void addSheep(Sheep sheep) {
if (sheep != null) {
if (sheeps == null) {
sheeps = new ArrayList<>();
}
if (!sheeps.contains(sheep)) {
sheeps.add(sheep);
}
}
}
}
@Entity
public class Sheep {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name;
@ManyToOne(fetch = FetchType.EAGER, optional = false)
@JoinColumn(name="shepard_id")
private Shepard shepard;
public Sheep(Shepard shepard, String name) {
this.shepard = shepard;
this.name = name;
shepard.addSheep(this);
}
}
现在,当我编写一个 Junit 测试并执行以下操作时。请注意,Sheep 构造函数调用 Shepard.addSheep(Sheep)!
EntityManagerFactory emf = Persistence.createEntityManagerFactory("data");
EnttyManager em = emf.createEntityManager();
Shepard shepard = new Shepard();
// I Persist Shepard
em.getTransaction().begin();
em.persist(shepard);
em.getTransaction().commit();
// II Persist Tilda
Sheep tilda = new Sheep(shepard, "Tilda");
em.getTransaction().begin();
em.persist(tilda);
em.getTransaction().commit();
// III Persist Martha via Shepard
Sheep martha = new Sheep(shepard, "Martha");
em.getTransaction().begin();
em.merge(shepard);
em.getTransaction().commit();
然后对 Sheep's 进行命名查询,我得到一个重复的“Tilda”条目!
当我编码时,这不会发生
em.persist(martha);
而是作为最后一个实体管理器访问。
分析调试输出,我可以看到在II之后有一个 [id=1] 的 Shepard 对象和一个 [id=1] 的 Sheep 对象。在III之前和之后,Shepard 持有 Sheeps 的两个参考文献,之前用 [id= 1 ] 表示 Tilda 和 [id=null] 表示 Martha。在III之后,Shepard 拥有两个 Sheeps 的参考文献,[id= 2 ] 代表 Tilda,[id=3] 代表 Martha。
从 EclipseLink 调试输出中,我可以看到III向 Sheep 表发出了两个插入语句。在数据库中,最终有三个Sheep 条目,其 id 如上所述。
此外,我收到以下错误:
[EL Warning]: 2013-06-21 09:53:26.631--UnitOfWork(221387686)--Thread(Thread[main,5,main])--Exception [EclipseLink-7251] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345): org.eclipse.persistence.exceptions.ValidationException
Exception Description: The attribute [id] of class [Sheep] is mapped to a primary key column in the database. Updates are not allowed.
这是 EclipseLink 的错误吗?或者我在这里做错了什么?