hierbnate继承注解的三种方法

来源:互联网 发布:ms sqlserver 编辑:程序博客网 时间:2024/06/04 08:23

方法1:

假设A为父类,B、C都为继承A的子类,使用的@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 为每一个类(不管是子类还是父类)创建一张表,这种方法的关键是要保证ID不能重复,hibernate中的做法是另外建一张存储ID的表M,每一次添加A类或A的子类时候,都将表M中的ID值加1,然后拿出。

@Entity@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)public class Animal implements java.io.Serializable{private int id ;private String name ;//id生成策略重要@Id  @GeneratedValue(strategy=GenerationType.TABLE)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;}}

子类B:

@Entity@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)public class Cat extends Animal{private int color ;public int getColor() {return color;}public void setColor(int color) {this.color = color;}

子类C:

@Entity@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)public class Dog extends Animal{private String sing ;public String getSing() {return sing;}public void setSing(String sing) {this.sing = sing;}
插入数据,结果如下图

animal

idname1a1
cat

idnamecolor2cat11
dag

idnamesing3dog1mylove
另外,hibernate还有一张记录id的sequence表

hibernate_sequences

sequence_namesequence_next_hi_valueanimal3

方法2:使用一张表装下父类和子类中的所有属性,当然该表中存在大量的冗余,使用的是@DiscriminatorColumn和@DiscriminatorValue来标识不同的类

父类A:

@Entity@Inheritance(strategy=InheritanceType.SINGLE_TABLE)@DiscriminatorColumn(name="personType")@DiscriminatorValue("person")public class Person implements java.io.Serializable{@Id@GeneratedValueprivate int id ;private String name ;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;}}
子类B:

@Entity@DiscriminatorValue("student")public class Student extends Person{private int height ;public int getHeight() {return height;}public void setHeight(int height) {this.height = height;}}

子类C:

@Entity@DiscriminatorValue("teacher")public class Teacher extends Person{private String title ;public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}}
自行插入数据之后,可以看到表中结构和结果:

personTypeidnameheighttitleperson1a man  student2tom174.4 teacher3  professor
虽然设计非常简单,缺点也非常明显,那是非常浪费数据库的空间.


方法3,使用的是join方式 .一张总表包含父类的基本定义,不同的子类在不同的表中,只包含独有的属性,但存在对总表的引用。

父类:

@Entity@Inheritance(strategy=InheritanceType.JOINED)public class Flower {private int id ;private String name ;@ Id@GeneratedValuepublic 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;}}

子类B:

@Entity@PrimaryKeyJoinColumn(name="roseId")public class Rose extends Flower{private double price ;public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}}

子类C:

@Entity@PrimaryKeyJoinColumn(name="jasmineId")public class Jasmine extends Flower{private String address ;public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}

那么在你每次杀入数据时,实际上hibernate在两张表中都进行了插入,总表只记录了Id和name,子表中记录了Id和其它属性。

flower表中:

idname1flower2rose3jasmine
在rose表中:

priceroseId123.42
在jasmine表中:

addressjasmineIdamercian3
以上就是三种继承映射了,可以说每种都有自己的缺点和优势,在应用时可以根据自己的需求去选择了。


0 0
原创粉丝点击