我是JPA世界的新手,遇到了一些我不知道如何解决的麻烦。我希望有人不介意向我解释我哪里出错了。我得到了这样的数据库设计:
表B和D只是地图,因此不是实体。我已经像这样定义了实体A,C和E:
@Entity
@Table (name = "A")
public class A implements Serializable{
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "ID")
private int id;
@OneToOne(cascade = CascadeType.ALL)
@JoinTable(name = "B",
joinColumns = @JoinColumn(name="A_ID", nullable=false),
inverseJoinColumns = @JoinColumn(name="C_ID", nullable=false))
private C c;
....
}
@Entity
@Table(name = "C")
public class AddressEntity implements Serializable{
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "ID")
private int id;
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "D",
joinColumns = @JoinColumn(name="C_ID"),
inverseJoinColumns = @JoinColumn(name="E_ID"))
private List<E> e;
....
}
@Entity
@Table(name = "E")
public class E implements Serializable{
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "ID")
private int id;
@Column(name = "LINE")
private String line;
}
A有C,C有多个E。 通过这种安排,我编写了测试,创建了一个New A,然后是一个New C并将其分配给A然后将两个New E分配给C,然后将它们分配给C,然后保持A。
然后我找到A并删除A并确保删除它的子项。 这个测试适用于hibernate但是因为我们的服务将在WebSphere 8上运行,所以我们将JPA实现切换到OpenJPA。在OpenJPA下,此测试失败,因为OpenJPA尝试在删除表B中的条目之前从表C中删除条目。这会引发异常,因为表B具有表C的外键约束。
我希望我在代表我的不正当理解的基础上犯了一个简单的错误,并且OpenJPA只是揭露了这一点。