Tau*_*ren 29 java hibernate jpa
我的数据模型代表法律实体,例如商业或个人.两者都是纳税实体,并且都有一个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
Run Code Online (Sandbox Code Playgroud)
我在MySQL数据库上使用Hibernate JPA Annotations,其类如下所示:
@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;
}
Run Code Online (Sandbox Code Playgroud)
问题是,Phone和Address对象需要参考他们的主人,这是一个AbstractLegalEntity.Hibernate抱怨:
@OneToOne or @ManyToOne on Phone references an unknown
entity: AbstractLegalEntity
Run Code Online (Sandbox Code Playgroud)
看起来这将是一个相当常见的Java继承场景,所以我希望Hibernate会支持它.我已经尝试根据Hibernate论坛问题更改AbstractLegalEntity的映射,不再使用@MappedSuperclass:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
Run Code Online (Sandbox Code Playgroud)
但是,现在我收到以下错误.在阅读这种继承映射类型时,看起来我必须使用SEQUENCE而不是IDENTITY,并且MySQL不支持SEQUENCE.
Cannot use identity column key generation with <union-subclass>
mapping for: ConcreteBusinessEntity
Run Code Online (Sandbox Code Playgroud)
当我使用以下映射时,我在使事情正常工作方面取得了更多进展.
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
name="entitytype",
discriminatorType=DiscriminatorType.STRING
)
Run Code Online (Sandbox Code Playgroud)
我想我应该继续这条道路.我担心的是,我将它映射为一个@Entity我真的不想要一个AbstractLegalEntity实例永远存在的时候.我想知道这是否是正确的方法.对于这种情况,我应该采取什么样的正确方法?
mil*_*lbr 42
使用:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
AbstractLegalEntity
Run Code Online (Sandbox Code Playgroud)
然后在数据库中,您将拥有一个用于AbstractLegalEntity的表和用于扩展AbstractLegalEntity类的类的表.如果它是抽象的,你将不会有AbstractLegalEntity的实例.可以使用多态性.
当你使用:
@MappedSuperclass
AbstractLegalEntity
@Entity
ConcretePersonEntity extends AbstractLegalEntity
Run Code Online (Sandbox Code Playgroud)
它在数据库中只创建一个表ConcretePersonEntity,但是包含两个类的列.
| 归档时间: |
|
| 查看次数: |
47373 次 |
| 最近记录: |