Hibernate实体对象继承的三种方法
程序员文章站
2023-01-04 08:37:04
hibernate实体对象继承的方法
hibernate继承策略总共有三种,一种是共用一张表;一种是每个类一张表,表里面储存子类的信息和父类的信...
hibernate实体对象继承的方法
hibernate继承策略总共有三种,一种是共用一张表;一种是每个类一张表,表里面储存子类的信息和父类的信息;还有一种是通过表连接的方式,每个类都有一张表,但是子类对应的表只保存自己的信息,父类对应的表保存父类的信息,它们之间通过子类表和父类表的关联来获取所有的信息。
第一种方式,即共用一张表:
@entity @inheritance(strategy=inheritancetype.single_table) @discriminatorcolumn(name="discriminator", discriminatortype=discriminatortype.string)//表示区分不同的对象的字段名 @discriminatorvalue("person")//用来表示该对象是何种对象的,即区分器 public class parent { private int id; private string name; @id @generatedvalue public int getid() { return id; } public void setid(int id) { this.id = id; } public string getname() { return name; } public void setname(string name) { this.name = name; } } @entity @discriminatorvalue("child1") public class child1 extends parent { private string email; public string getemail() { return title; } public void setemail(string email) { this.email = email; } } @entity @discriminatorvalue("child2") public class child2 extends parent { private string address; public string getaddress() { return score; } public void setaddress(string address) { 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 ) public class parent { private int id; private string name; @id @generatedvalue(generator="t_gen", strategy=generationtype.table)//这个就是用表生成器生成的,用同一个生成器就可以控制它们的id不重复 public int getid() { return id; } public void setid(int id) { this.id = id; } public string getname() { return name; } public void setname(string name) { this.name = name; } } @entity public class child2 extends parent { private string address; public string getaddress() { return score; } public void setaddress(string address) { this.address = address; } } @entity public class child1 extends parent { private string email; public string getemail() { return title; } public void setemail(string email) { this.email = email; } }
弟三种方式是采用表连接的方式:
@entity @inheritance(strategy=inheritancetype.joined) public class parent { private int id; private string name; @id @generatedvalue public int getid() { return id; } public void setid(int id) { this.id = id; } public string getname() { return name; } public void setname(string name) { this.name = name; } } @entity public class child2 extends parent { private string address; public string getaddress() { return score; } public void setaddress(string address) { this.address = address; } } @entity public class child1 extends parent { private string email; public string getemail() { return title; } public void setemail(string email) { this.email = email; } }
采用表连接的情况,还是每个类拥有自己的一张表,只是子类对应的表只保存子类的信息,其父类的信息由父类的表保存。当需要获取子类的完整信息时通过表连接的方式连接子类的表和父类的表获取对应信息。可以在子类的表上标注@primarykeyjoincolumn(name="foreignkeyname")指明子类表相对于父类表外键的名称。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
推荐阅读
-
JavaScript使用原型和原型链实现对象继承的方法详解
-
CorelDRAW X8中如何镜像对象?CDR镜像的三种方法
-
Java通过注解和反射 实现模拟 Hibernate Validator验证框架对实体对象的字段验证功能
-
Hibernate实体对象继承的三种方法
-
利用函数返回oracle对象表的三种方法
-
JavaScript三种区分对象和数组的方法介绍
-
Python判断对象是否为文件对象(file object)的三种方法示例
-
第十一天-Java继承/多态特性-方法重写/抽象类/适配器/对象运行时的多态/
-
CDR X8移除曲线对象中重复或冗余节点的三种方法
-
JavaScript创建对象的三种方法