JPAinheritance

嗨,我是JPA的新手,我无法理解它如何处理inheritance。

我有一个特定的问题我需要在不改变DB方案的情况下解决,但是如果你找不到解决方案,我会很感激使用不同的DB方案的解决方案建议(欢迎使用Hibernate / TopLink解决方案)。

如果我不清楚或您需要更多信息,请告诉我。 提前致谢!

我有这个数据库:

TABLE Fruit Id Varchar (10) Primary Key size Varchar (10) fruit_type Varchar(10) TABLE Apple Id Varchar (10) Primary Key Foreign Key references Fruit.Id Apple_Property Varchar(10) 

到目前为止我的实体看起来像这样:

 @Entity @Inheritance(strategy=InheritanceType.JOINED) @DiscriminatorColumn(name="fruit_type", discriminatorType=DiscriminatorType.Char) @DiscriminatorValue(value="fruit") public class Fruit implements Serializable { @Id protected String Id; protected String size; } @Entity @DiscriminatorValue(value="apple") //@PrimaryKeyJoinColumn(name="Id" , referencedColumnName="Id") public class Apple extends Fruit implements Serializable { private String Apple_Property; } 

目前我能够毫无问题地持久保存Fruit对象。只有当他们的Fruit对象尚未持久化时,Apple对象才会持久存在。

如果我尝试使用已持久的Fruit对象持久化一个苹果对象:

 Fruit fruit1 = new Fruit("1", "Small"); Apple apple1 = new Apple(fruit1, "red"); provider.create(fruit1); provider.create(apple1); 

我将收到一个错误,因为JPA尝试在Fruit表上创建一个Id =“1”的新行已经存在。

..

当使用JPA来持久保存子对象(即你的case中的provider.create(apple1) )时,会将一条记录插入到子表及其所有父表中。 所以provider.create(apple1)会将记录插入Fruit,并将记录插入Apple表。

在您的示例中,如果您只想保留一个apple对象,只需调用provider.create(apple1) 。 它也会坚持苹果对象内的水果参考。

顺便说一句,我建议Fruit Table的PK是一个数字类型,并使用@GeneratedValue来标记Fruit bean的ID字段。 通过这种方式,您可以让数据库为您生成ID,不再需要在java代码中显式设置它以避免此“ID已存在错误”,因为在Java代码中设置了已存在的ID。

我认为这与设计完全一致。 当您使用联接inheritance并持久保存苹果对象时,JPA将自动插入到apple和fruit表中。 您无需在实体类中建模其他关系或JoinColumn。

您正在尝试在创建db表时使用javainheritance概念,这在某些情况下是不可能的。 我可以为这个问题考虑一种不同的方法。 有table fruit_type和水果。 fruit_type(id,typename,desc)fruit(id,name,type_id,desc)这里的type_id将是外键。

我有同样的问题,到目前为止,我找到的唯一方法是查询父项并使用父项构造子项。 然后删除父级并重新创建两个记录。