Hibernate入门07_继承映射01_discriminator方式
2017-06-02 22:41
627 查看
一、映射继承三种方式
1、discriminator方式,子类和父类公用一张表
2、joined方式
3、union方式
二、以Student继承Person为例,先说第1种,后两种分别下一篇文章说及。
三、代码
public class Person { private Integer id; private String name; private String age; //set/get... } public class Student extends Person { private String school; //set/get... }
Person.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2017-3-27 22:49:29 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping package="com.hibernate.n2n"> <class name="Person" table="PERSONS" discriminator-value="PERSON"> <id name="id" type="java.lang.Integer"> <column name="ID" /> <generator class="native" /> </id> <!-- 配置辨别者列 --> <discriminator column="TYPE" type="string"></discriminator> <property name="name" type="java.lang.String"> <column name="NAME" /> </property> <property name="age" type="java.lang.String"> <column name="AGE" /> </property> <!-- 映射子类Student,使用subclass进行映射 --> <subclass name="Student" discriminator-value="STUDENT"> <property name="school" type="string" column="SCHOOL"></property> </subclass> </class> </hibernate-mapping>
Test
package com.hibernate.n2n; import static org.junit.Assert.*; import java.util.List; import java.util.Set; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; import org.junit.After; import org.junit.Before; import org.junit.Test; public class HibernateTest { private SessionFactory sessionFactory; private Session session; private Transaction transaction; @Test public void testSave(){ Person person = new Person(); person.setAge("22"); person.setName("AA"); session.save(person); Student student = new Student(); student.setSchool("BB"); student.setAge("18"); student.setName("CC"); session.save(student); } /*** * 缺点:使用了辨别者列 * 子类独有的字段不能添加非空约束 * 若继承太深,则数据表的字段也会较多 */ @Test public void testQuery(){ //查询父类数据,只需查询一张表 List<Person> persons = session.createQuery("FROM Person").list(); System.out.println(persons.size()); //查询父类数据,也只需查询一张表 List<Student> students = session.createQuery("FROM Student").list(); System.out.println(students.size()); } @Before public void init() { System.out.println("HibernateTest.init()"); // 1.创建一个sessionFactory对象 Configuration configuration = new Configuration().configure(); ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()) .buildServiceRegistry(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); // 2.创建一个session对象 session = sessionFactory.openSession(); // 3.开启事务 transaction = session.beginTransaction(); } @After public void destroy() { System.out.println("HibernateTest.destroy()"); // 5.提交事务 transaction.commit(); // 6.关闭session session.close(); // 7.关闭SessionFactory sessionFactory.close(); } }
四,运行结果
相关文章推荐
- Hibernate入门07_继承映射02_joined方式
- Hibernate入门07_继承映射03_union方式
- Hibernate继承映射的三种方式
- Hibernate入门09 - 继承映射2
- Hibernate继承映射的“Could not format discriminator value to SQL string”错误解决方法
- Hibernate继承映射方式一
- Hibernate 简单使用(七)继承映射的几种方式
- hibernate中继承映射的三种方式(SINGLE_TABLE,TABLE_PER_CLASS,JOINED)
- Hibernate入门08 - 继承映射1
- Hibernate继承映射方式之每个子类一张表
- 码农小汪-Hibernate学习10-hibernate继承映射 @DiscriminatorColumn DiscriminatorType @Inheritance InheritanceType
- Hibernate继承映射之使用多子表方式实例
- Hibernate入门(5):关联映射&继承映射
- Hibernate继承映射“Could not format discriminator”错误解决
- Hibernate入门08 - 继承映射1
- Hibernate继承映射的“Could not format discriminator value to SQL string”错误解决方法
- hibernate笔记--继承映射关系的三种实现方式
- Hibernate继承映射简单入门
- Hibernate入门09 - 继承映射2
- Hibernate_映射_继承结构映射2_另外两种映射方式