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
idname1a1catidnamecolor2cat11
dagidnamesing3dog1mylove
另外,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
- hierbnate继承注解的三种方法
- js的三种继承方法
- 关于原型继承的三种方法
- 三种继承的方法:public 继承/private继承/protected继承详解及区别
- 三种继承的方法:public 继承/private继承/protected继承详解及区别
- JS面向对象的继承三种方法:原型继承,原型冒充继承,复制继承
- javascript面向对象继承的三种方法
- JS中继承机制的三种方法
- hibernate 映射继承关系的三种方法
- 理解继承(三):非构造函数的继承方法
- C++的三种继承
- spring security 注解@EnableGlobalMethodSecurity的三种开启注解方式
- 使用Hibernate注解来配置多对一单向的三种方法
- 使用Hibernate注解来配置多对一单向的三种方法
- 使用Hibernate注解来配置多对一单向的三种方法
- Hibernate 继承的注解配置
- SpringMVC中注解的继承
- spring3 mvc系列三:验证方法的学习(注解版)
- NDK JNI 的关键点
- 各种视频输出端口(HDMI、DVI、VGA、RGB、分量、S端子)图片说明
- 排序算法(三)- 直接插入排序
- 昨天做项目的时候,遇到了一个tabbar 影响底部按钮的问题
- Unity Script Extensions – Attribute (特性)还算多吧
- hierbnate继承注解的三种方法
- KVM,QEMU核心分析
- 地址总线字长内存容量寻址范围之间的计算
- iMX6中各种系统时钟的信息存放在debug文件系统中
- 在Ubuntu14.04下安装Redis
- 从零开始学习jQuery (六) AJAX快餐
- 项目一--动态链表体验1
- 两篇很牛的vim使用技巧
- Virtio-blk浅析