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

抽象超类的Hibernate(JPA)继承映射

蓬思博
2023-03-14
问题内容

我的数据模型代表法人实体,例如企业或个人。两者都是纳税实体,都具有TaxID,电话号码和邮件地址的集合。

我有一个Java模型,其中有两个扩展抽象类的具体类。抽象类具有两个具体类共有的属性和集合。

AbstractLegalEntity        ConcreteBusinessEntity    ConcretePersonEntity
-------------------        ----------------------    --------------------
Set<Phone> phones          String name               String first
Set<Address> addresses     BusinessType type         String last
String taxId                                         String middle

Address                    Phone
-------                    -----
AbsractLegalEntity owner   AbstractLegalEntity owner
String street1             String number
String street2           
String city
String state
String zip

我正在 MySQL* 数据库上使用 Hibernate JPA注释,其类如下: *

@MappedSuperclass
public abstract class AbstractLegalEntity {
    private Long id;  // Getter annotated with @Id @Generated
    private Set<Phone> phones = new HashSet<Phone>();  // @OneToMany
    private Set<Address> address = new HashSet<Address>();  // @OneToMany
    private String taxId;
}

@Entity
public class ConcretePersonEntity extends AbstractLegalEntity {
    private String first;
    private String last;
    private String middle;
}

@Entity
public class Phone {
    private AbstractLegalEntity owner; // Getter annotated @ManyToOne @JoinColumn
    private Long id;
    private String number;
}

问题是,PhoneAddress对象需要参考他们的主人,这是一个AbstractLegalEntity。hibernate抱怨:

@OneToOne or @ManyToOne on Phone references an unknown 
entity: AbstractLegalEntity

看来这将是一个相当普遍的Java继承方案,所以我希望Hibernate会支持它。我已经尝试基于Hibernate论坛问题更改AbstractLegalEntity的映射,不再使用@MappedSuperclass

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

但是,现在出现以下错误。阅读此继承映射类型时,看起来我必须使用SEQUENCE而不是IDENTITY,并且MySQL不支持SEQUENCE。

Cannot use identity column key generation with <union-subclass> 
mapping for: ConcreteBusinessEntity

使用以下映射时,我在使事情正常工作方面取得了更大的进步。

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
        name="entitytype",
        discriminatorType=DiscriminatorType.STRING
)

我想我应该继续走这条路。我担心的是,我将它映射为@Entity确实不希望AbstractLegalEntity实例存在的时间。我想知道这是否是正确的方法。在这种情况下,我应该采取什么正确的方法?


问题答案:

采用:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
AbstractLegalEntity

然后在html" target="_blank">数据库中,您将有一张用于AbstractLegalEntity的表和一张用于扩展AbstractLegalEntity类的类的表。如果AbstractLegalEntity是抽象的,则不会有实例。这里可以使用多态。

使用时:

@MappedSuperclass
AbstractLegalEntity

@Entity
ConcretePersonEntity extends AbstractLegalEntity

它在数据库中仅创建一个表ConcretePersonEntity,但具有来自两个类的列。



 类似资料:
  • 问题内容: 您将如何在以下示例代码中配置注释?我只想保留JPA注释,避免使用Hibernate特定的依赖项。 下面的代码正确吗? (这些类将具有多个版本,RefSomeOtherExample等,并且每个类一个db表。有些可能会添加其他字段(列),但大多数只会使用继承自“ RefData”基类的基本字段。) 基类: 最终,我想使用Hibernate的SchemaExport类从中生成模式创建脚本。

  • 我的代码: 问题:“

  • 我有一个关于JPA中继承的问题,是否可以使用JOINED策略来实现这个层次结构? 这是我的代码: 在上面的层次结构之后,我尝试使用JPQL进行查询,这是查询: 此代码从主代码运行 当我运行该查询时,会抛出以下错误 导致原因:com . MySQL . JDBC . exceptions . JDBC 4 . MySQL syntaxerrorexception:未知列“employee1_。“字段

  • 继承一个可以实现的普通超类有什么不同吗? atm我有一个名为的抽象类,我有/扩展这个。 abstractcar中的一个字段设置为"私有int容量" 但是在子类“小型汽车”中,当我输入“容量”作为构造函数中使用的变量时,它说“容量在抽象汽车中有私有访问” 我想: > 子类继承超类的所有字段和方法? 我现在该怎么进行?

  • 我有一个抽象类,这个类是在她的子类中扩展的: < li >我在这个抽象类上实现了一个方法,并抽象了另一个方法 < li >实现的方法是每个子类对象都必须访问的通用方法。所以我决定在抽象类上实现它,避免在每个子类上实现相同的方法。 小例子: 我想听听你对这种实施方式的看法, 问候。

  • 1. 前言 本节课程和大家一起学习继承映射。通过本节课程的学习,你将了解到: 什么是继承映射; 实现继承映射的 3 种方案。 2. 继承映射 学习继承映射之前,需要搞清楚什么是继承映射? 继承是 OOP 中的概念,其目的除了复用代码之外,还用来描述对象在现实世界中的关系。 为了更好地讲解继承映射,咱们再在数据库中创建一张老师表。数据库中多了一张表,按照使用 Hibernate 的套路,理所当然应该