当前位置: 首页 > 面试题库 >

JPA继承

岑熙云
2023-03-14
问题内容

嗨,我是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;
}

目前,我能够持久地保存Fruit对象。.仅当尚未持久化其Fruit对象时,Apple对象才能持久。

如果我尝试使用已经存在的Fruit对象来保留一个Apple对象:

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)将一条记录插入到Fruit并将一条记录插入到Apple表。

在您的示例中,如果只想保留一个Apple对象,只需调用provider.create(apple1)就足够了。它将水果引用也保留在苹果对象内。

顺便说一句,我建议Fruit Table的PK为数字类型,并用于@GeneratedValue标记Fruit
bean的ID字段。这样,您可以让数据库为您生成一个ID,而不再需要在Java代码中显式设置它,以避免由于在Java代码中设置了一个已经存在的ID而导致此“
ID已经存在错误”。



 类似资料:
  • 主要内容:JPA继承注解,JPA继承策略继承是面向对象编程语言的一个关键特性,其中子类可以获取其父类的属性。 此功能增强了代码的可重用性。 关系数据库不支持继承机制。 因此,Java Persistence API(JPA)用于映射关系数据库模型中的继承关键特性。 JPA继承注解 以下是最常用的JPA继承注释 - - 此注解应用于根实体类以定义继承策略。 如果没有使用此注释定义策略类型,那么它遵循单表战略。 - 此注释应用于由其子类继承

  • 我有一个定义如下的表: 然后我有了这个继承的表: Hibernate在数据库中创建了两个表,但是当我试图在JPA上删除一个继承的对象时,它会返回外键约束违反错误,因为它试图删除第一个类。如何在删除超类时首先删除继承类,以避免键约束违反错误? 谢谢你。

  • 主要内容:连接策略示例在连接策略中,为每个实体类生成一个单独的表。 每个表的属性都与主键连接。 它消除了字段字重复的可能性。 以下语法表示连接的策略: - 连接策略示例 在这个例子中,我们将员工分为活跃员工和退休员工。 因此,子类和继承父类的和字段。 现在,按照以下步骤创建JPA项目 - 第1步: 在包下创建一个根实体类并指定所有必需的属性和注释。 文件:Employee.java - 第2步: 在包下创建实体类(它是

  • 主要内容:单表策略示例单表策略是定义继承实现的最简单有效的方法之一。 在这种方法中,多个实体类的实例仅作为属性存储在单个表中。 以下语法表示单个表策略 - 单表策略示例 在这个例子中,我们将员工分为活跃员工和退休员工。 因此,子类和继承父类的和字段。 现在,按照以下步骤创建JPA项目 - 第1步: 在包下创建一个根实体类并指定所有必需的属性和注释。 文件:Employee.java - 第2步: 在包下创建实体类(它是

  • 我有一个项目,其中一部分数据结构是用@ Inheritance(strategy = Inheritance type)制作的。已加入)。数据结构的这一部分看起来像这样: 该设计基于本文的思想。我使用Hibernate和JPA2接口作为我的数据层。上面的结构产生了下面的pojo/dao类(省略了getter和setter): 基本项: 物理项目: 一些硬件: 其他硬件: 这是我的问题: 我的另一个