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将是外键。
我有同样的问题,到目前为止,我找到的唯一方法是查询父项并使用父项构造子项。 然后删除父级并重新创建两个记录。
- 无法导入org.hibernate.session
- 如何在dropwizard上使用guice自动连接HibernateBundle?
- Hibernate有多对多关系集或列表?
- 调用getNextException以查看原因:如何使Hibernate / JPA显示数据库服务器消息以查找exception
- 禁止使用Hibernate Envers为实体创建_AUD表?
- Hibernate单向父/子关系 – delete()对子表而不是删除执行更新
- 类型,属性,实例和值之间的关系
- org.hibernate.HibernateException:数据库未返回本机生成的标识值
- 查找与所选点的特定距离内的所有地址的最佳方法是什么