(10)映射继承关系一之继承关系都映射在一张表中(@Inheritance(strategy=InheritanceType.SINGLE_TABLE))
来源:互联网 发布:linux中的pwd命令 编辑:程序博客网 时间:2024/06/06 19:45
EJB3支持三种类型的继承映射:
• 每个类一张表(Table per class)策略: 在Hibernate中对应元素:
• 每个类层次结构一张表(Single table per class hierarchy)策略:在Hibernate中对应元素
• 连接的子类(Joined subclasses)策略:在Hibernate中对应 元素
一、每个类层次结构一张表【整个继承层次结构中的父类和子类的所有属性都映射在一张表中】:通过区分符来区分discriminator
@Inheritance 和 @DiscriminatorColumn 注解只能用于实体层次结构的顶端.
在下面的例子中,person是父类,在这个类里面讲继承策略定义为InheritanceType.SINGLE_TABLE,并通过@DiscriminatorColumn注释定义了辨别符列(还可以定义辨别符的类型)。最后,对于继承层次结构中的每个类,,@DiscriminatorValue注释指定了用来辨别该类的值。辨别符列的名字默认是DTYPE,其默认值为实体名,默认类型是DiscriminatorType.STRING.
@Entity@Inheritance(strategy=InheritanceType.SINGLE_TABLE)//继承策略是每个类层次结构映射一张表@DiscriminatorColumn(name="discrimitor",discriminatorType=DiscriminatorType.STRING)//定义了辨别符列,和辨别符的类型//上面的两行注解只能用于实体层次结构的顶端@DiscriminatorValue("person")//用于辨别该类的值public class Person { 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; } }
student继承父类person【@DiscriminatorValue】
@Entity@DiscriminatorValue("student")public class student extends Person { private int score; public int getScore() { return score; } public void setScore(int score) { this.score = score; } }//teacher表类似,略
通过这种方式,则person表中会有父类和子类所有的属性和区分符,当某个子类的字段较多时,会造成存储空间大量的浪费
create table Person ( discrimitor varchar(31) not null, id integer not null auto_increment, name varchar(255), title varchar(255), score integer, primary key (id) )
Read:当指定是哪个子类时,会依据 student0_.id=? and student0_.discrimitor=’student’来搜索
当没有指定时,就会按照父类id进行搜索 person0_.id=?
@Test public void testGet() { testSave(); Session session=sf.getCurrentSession(); session.beginTransaction(); student s=(student) session.get(student.class, 1); /* * 指定取哪个对象,则只会输出该对象的信息 select student0_.id as id0_0_, student0_.name as name0_0_, student0_.score as score0_0_ from Person student0_ where student0_.id=? and student0_.discrimitor='student' */ Person p=(Person) session.get(Person.class, 2); /* * 没有指定是哪个对象,则会select person中的所有项 select person0_.id as id0_0_, person0_.name as name0_0_, person0_.title as title0_0_, person0_.score as score0_0_, person0_.discrimitor as discrimi1_0_0_ from Person person0_ where person0_.id=? */ session.getTransaction().commit(); }
二、
- (10)映射继承关系一之继承关系都映射在一张表中(@Inheritance(strategy=InheritanceType.SINGLE_TABLE))
- (11)映射继承关系二之每个类对应一张表(@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
- (12)映射继承关系三之连接的子类(@Inheritance(strategy=InheritanceType.JOINED))
- hibernate继承关系的映射(single_table,class_per_table,joined)
- hibernate继承关系的映射(single_table,class_per_table,joined)
- hibernate继承关系的映射(single_table,class_per_table,joined)
- Hibernate基础------》关系映射---》继承映射-》所有类映射到一张表中(类融合映射或者鉴别器映射)
- 十二、实体继承关系(类继树承结映射成一张表)
- hibernate继承关系映射方法(一)--共享一张表
- 继承关系 为没个类映射一张表
- hibernate的继承关系映射(一)
- 继承关系 整个继承数映射到一张表
- hibernate继承关系映射关系方法(二)--每个子类一张表
- 精通Hibernate之映射继承关系一
- Hibernate中继承关系映射一
- hibernate映射继承关系(一):一张表对应一整棵类继承树
- hibernate映射继承关系一
- 码农小汪-Hibernate学习10-hibernate继承映射 @DiscriminatorColumn DiscriminatorType @Inheritance InheritanceType
- socket的实现,安卓系统AOSP源码
- Mybatis批量修改mysql犯的两个错Query was empty和
- Dubbo调度机制解析(cluster扩展或者路由扩展)
- Android题目笔记(六)
- 6.13
- (10)映射继承关系一之继承关系都映射在一张表中(@Inheritance(strategy=InheritanceType.SINGLE_TABLE))
- ios-音乐播放器的简单实现
- Python模块matlotlib之pylot.plot()
- Qt编写自定义控件及插件的使用
- 全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域(转载)
- CMake Error: not providing "FindEigen3.cmake" in CMAKE_MODULE_PATH
- 这可能是最好的RxJava 2.x 教程(完结版)
- UVA 10106 Product (高精度乘法)
- VS2013+opencv3.0+QT5.7编译ok但是运行产生0xc000007b错误的解决方法