JPA Inheritance



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

我有一个特定的问题需要在不更改数据库方案的情况下解决,但如果您找不到解决方案,我将不胜感激使用不同数据库方案的解决方案建议(欢迎 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;
}

目前,我能够毫无问题地持久化水果对象。Apple 对象仅在其 Fruit 对象尚未持久化时保留。

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

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

我会得到一个错误,因为 JPA 尝试在水果表上创建一个 Id="1" 的新行已经存在。

..

当使用 JPA 持久化子对象(即在您的情况下provider.create(apple1))时,会将记录插入到子表及其所有父表中。因此,provider.create(apple1)将向水果插入一条记录,在 Apple 表中插入一条记录。

在你的例子中,如果你只想持久化一个苹果对象,只需调用provider.create(apple1)就足够了。它也会将水果引用保留在苹果对象中。

顺便说一句,我建议水果表的PK是一个数字类型,并使用@GeneratedValue来标记水果豆的ID字段。这样,你可以让数据库为你生成一个 ID,而不再需要在 java 代码中显式设置它,以避免因为设置了 java 代码中已经存在的 ID 而出现这种"ID 已经存在错误"。

我认为这完全按照设计工作。当您使用联接继承并持久化苹果对象时,JPA 将自动插入到苹果表和水果表中。无需在实体类中对其他关系或联接列进行建模。

您正在尝试在创建数据库表时使用 java 继承概念,这在本例中是不可能的。我可以想到一种不同的方法来解决这个问题。有餐桌fruit_type和水果。fruit_type(id, typename,desc)水果(id,名称,type_id,desc)在这里type_id将是外键。

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

相关内容

  • 没有找到相关文章

最新更新