我的数据模型代表法人实体,例如企业或个人。两者都是纳税实体,都具有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 forum question更改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
)

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

最佳答案

利用:

    @Entity
    @Inheritance(strategy = InheritanceType.JOINED)
    AbstractLegalEntity
在数据库中,您将为AbstractLegalEntity提供一个表,为类提供扩展AbstractLegalEntity类的表。如果是抽象的AbstractLegalEntity,则不会有实例。多态性可以在这里使用。
使用时:
    @MappedSuperclass
    AbstractLegalEntity

    @Entity
    ConcretePersonEntity extends AbstractLegalEntity
这将在数​​据库中仅创建一个名为ConcretePersonEntity的表,其中包含两个类的列。

10-06 09:15