我的数据模型代表法人实体,例如企业或个人。两者都是纳税实体,都具有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; }
问题是,Phone和Address对象需要参考他们的主人,这是一个AbstractLegalEntity。hibernate抱怨:
Phone
Address
AbstractLegalEntity
@OneToOne or @ManyToOne on Phone references an unknown entity: AbstractLegalEntity
看来这将是一个相当普遍的Java继承方案,所以我希望Hibernate会支持它。我已经尝试基于Hibernate论坛问题更改AbstractLegalEntity的映射,不再使用@MappedSuperclass:
@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
采用:
@Entity @Inheritance(strategy = InheritanceType.JOINED) AbstractLegalEntity
然后在数据库中,您将有一张用于AbstractLegalEntity的表和一张用于扩展AbstractLegalEntity类的类的表。如果AbstractLegalEntity是抽象的,则不会有实例。这里可以使用多态。
使用时:
@MappedSuperclass AbstractLegalEntity @Entity ConcretePersonEntity extends AbstractLegalEntity
它在数据库中仅创建一个表ConcretePersonEntity,但具有来自两个类的列。