Hibernate实体对象继承的三种方法
Hibernate实体对象继承的方法
hibernate继承策略总共有三种,一种是共用一张表;一种是每个类一张表,表里面储存子类的信息和父类的信息;还有一种是通过表连接的方式,每个类都有一张表,但是子类对应的表只保存自己的信息,父类对应的表保存父类的信息,它们之间通过子类表和父类表的关联来获取所有的信息。
第一种方式,即共用一张表:
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="discriminator",discriminatorType=DiscriminatorType.STRING)//表示区分不同的对象的字段名
@DiscriminatorValue("person")//用来表示该对象是何种对象的,即区分器
publicclassParent{
privateintid;
privateStringname;
@Id
@GeneratedValue
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
}
@Entity
@DiscriminatorValue("child1")
publicclassChild1extendsParent{
privateStringemail;
publicStringgetEmail(){
returntitle;
}
publicvoidsetEmail(Stringemail){
this.email=email;
}
}
@Entity
@DiscriminatorValue("child2")
publicclassChild2extendsParent{
privateStringaddress;
publicStringgetAddress(){
returnscore;
}
publicvoidsetAddress(Stringaddress){
this.address=address;
}
}
这种情况父类和所有子类的所有信息都保存在同一张表里面,通过我们指定的@DiscriminatorColumn对应的@DiscriminatorValue来区别不同的类。当没有指定@DiscriminatorValue的时候将使用全类名来作为DiscriminatorValue。
第二种策略是每个类一张表,保存所有信息:
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
@TableGenerator(//一个类一张表,最重要的是要保证它们的id由一个生成器产生,@TableGenerator就是为了控制这个的
name="t_gen",
table="t_gen_table",
pkColumnName="t_pk",
valueColumnName="t_value",
pkColumnValue="person_pk",
initialValue=1,
allocationSize=1
)
publicclassParent{
privateintid;
privateStringname;
@Id
@GeneratedValue(generator="t_gen",strategy=GenerationType.TABLE)//这个就是用表生成器生成的,用同一个生成器就可以控制它们的id不重复
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
}
@Entity
publicclassChild2extendsParent{
privateStringaddress;
publicStringgetAddress(){
returnscore;
}
publicvoidsetAddress(Stringaddress){
this.address=address;
}
}
@Entity
publicclassChild1extendsParent{
privateStringemail;
publicStringgetEmail(){
returntitle;
}
publicvoidsetEmail(Stringemail){
this.email=email;
}
}
弟三种方式是采用表连接的方式:
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
publicclassParent{
privateintid;
privateStringname;
@Id
@GeneratedValue
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
}
@Entity
publicclassChild2extendsParent{
privateStringaddress;
publicStringgetAddress(){
returnscore;
}
publicvoidsetAddress(Stringaddress){
this.address=address;
}
}
@Entity
publicclassChild1extendsParent{
privateStringemail;
publicStringgetEmail(){
returntitle;
}
publicvoidsetEmail(Stringemail){
this.email=email;
}
}
采用表连接的情况,还是每个类拥有自己的一张表,只是子类对应的表只保存子类的信息,其父类的信息由父类的表保存。当需要获取子类的完整信息时通过表连接的方式连接子类的表和父类的表获取对应信息。可以在子类的表上标注@PrimaryKeyJoinColumn(name="foreignKeyName")指明子类表相对于父类表外键的名称。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!