您的位置:首页 > 其它

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();

}

}


四,运行结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: