您的位置:首页 > 其它

hibernate的继承映射 之 三种示例

2010-06-08 19:38 281 查看
每一个实体一张表

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class table="T_Person" name="com.eomist.model.Person">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<property name="sex"/>
<property name="birthday"/>
<property name="address"/>
<property name="email"/>
<property name="phone"/>
<joined-subclass name="com.eomist.model.Leader" table="T_Leader">
<key column="leader_id"/>
<property name="grade" column="grade" />
<property name="major" column="major" />
<property name="schoolNumber" column="schoolNumber"/>
</joined-subclass>

<joined-subclass name="com.eomist.model.Teacher" table="T_Teacher">
<key column="teacher_id"/>
<property name="title" column="title" />
<property name="dept" column="dept" />
</joined-subclass>
</class>
</hibernate-mapping>
以上是表person,student,teacher的继承映射,在继承映射做数据的关连时!删除person中的数据,如果student,teacher中有对应的数据也会删除!删除student,teacher中的数据如果person中有对应的数据也会删除!


自动创建生成的sql语句,每一个实体一个表。

create table T_Leader (
leader_id integer not null,
grade varchar(255),
major varchar(255),
schoolNumber varchar(255),
primary key (leader_id)
) type=InnoDB;
10:11:04,250 DEBUG SchemaExport:377 -
create table T_Leader (
leader_id integer not null,
grade varchar(255),
major varchar(255),
schoolNumber varchar(255),
primary key (leader_id)
) type=InnoDB;
create table T_Person (
id integer not null auto_increment,
name varchar(255),
sex varchar(255),
birthday datetime,
address varchar(255),
email varchar(255),
phone varchar(255),
primary key (id)
) type=InnoDB;




每个子类一张表:

/**
* 歌手实体类(抽象父类)
*/
public abstract class Singer {
private String id;
private String name;
private String region;
private String description;
}
/**
* 乐队组合(Singer的一个子类)
*/
public class Bands extends Singer {
private String leader;
}
/**
* 单人歌手(Singer的一个子类)
*/
public class SingleSinger extends Singer {
private boolean gender;
}
每个属性都提供getters(),setters();方法。


Singer.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.hkrt.domain.Singer" abstract="true">
<id name="id">
<generator class="uuid"/>
</id>
<property name="name"/>
<property name="region"/>
<property name="description"/>

<union-subclass name="com.hkrt.domain.SingleSinger">
<property name="gender" column="single_gender"/>
</union-subclass>

<union-subclass name="com.hkrt.domain.Bands">
<property name="leader" column="bands_leader"/>
</union-subclass>
</class>
</hibernate-mapping>


生成的表结构sql ,hibernate 使用的UUID ,hibernate 本向支持,版本为2.5

create table Bands (
id varchar(255) not null,
name varchar(255),
region varchar(255),
description varchar(255),
bands_leader varchar(255),
primary key (id)
);
create table SingleSinger (
id varchar(255) not null,
name varchar(255),
region varchar(255),
description varchar(255),
single_gender bit,
primary key (id)
);


测试:

@Test
public void testAdd(){
Session session = sessionFactory.openSession();
session.beginTransaction();
SingleSinger ss = new SingleSinger();
ss.setName("小冠");
ss.setRegion("香港");
ss.setDescription("很多门");
ss.setGender(false);
session.save(ss);
Bands b = new Bands();
b.setName("花队");
b.setRegion("日韩");
b.setDescription("只会叫,唱的少");
b.setLeader("张伟");
session.save(b);
session.getTransaction().commit();
session.close();
}

@SuppressWarnings("unchecked")
@Test
public void TestSelectAll(){
Session session = sessionFactory.openSession();
session.beginTransaction();
//		SingleSinger sing =(SingleSinger)session.createQuery("from SingleSinger").uniqueResult();
//		System.out.println(sing);
List<Singer> singers = session.createQuery("from Singer").list();

for(Singer s : singers){
if(s instanceof SingleSinger){
System.out.println("是单人歌手");
}else if(s instanceof Bands){
System.out.println("是乐队组合");
}else if(s instanceof Singer){
System.out.println("是Singer类型");
}
System.out.println(s);
}

session.getTransaction().commit();
session.close();
}




所有类一个表:

实体与示例2一样,在此不贴了。

Singer.cfg.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.hkrt.domain.Singer" discriminator-value="p">
<id name="id">
<generator class="native"/>
</id>
<discriminator column="type" type="string" length="2"/>
<property name="name"/>
<property name="region"/>
<property name="description"/>

<subclass name="com.hkrt.domain.SingleSinger" discriminator-value="s">
<property name="gender" column="single_gender"/>
</subclass>

<subclass name="com.hkrt.domain.Bands" discriminator-value="b">
<property name="leader" column="bands_leader"/>
</subclass>
</class>
</hibernate-mapping>


生成表结构sql:

create table Singer (
id bigint not null auto_increment,
type varchar(2) not null,
name varchar(255),
region varchar(255),
description varchar(255),
single_gender bit,
bands_leader varchar(255),
primary key (id)
);


测试:

@Test
public void testAddSub(){
Session session = sessionFactory.openSession();
session.beginTransaction();
SingleSinger ss = new SingleSinger();
ss.setName("小冠");
ss.setRegion("香港");
ss.setDescription("很多门");
ss.setGender(false);

session.save(ss);

Bands b = new Bands();
b.setName("花队");
b.setRegion("日韩");
b.setDescription("只会叫,唱的少");
b.setLeader("张伟");

session.save(b);

session.getTransaction().commit();
session.close();
}

@Test
public void testGet(){
Session session = sessionFactory.openSession();
session.beginTransaction();

Singer singer = (Singer)session.get(Singer.class, Long.valueOf(2));

System.out.println(singer.getClass().getName());

System.out.println(singer);

session.getTransaction().commit();
session.close();
}

@SuppressWarnings("unchecked")
@Test
public void TestSelectAll(){
Session session = sessionFactory.openSession();
session.beginTransaction();

List<Singer> singers = session.createQuery("from Singer").list();

for(Singer s : singers){
if(s instanceof SingleSinger){
System.out.println("是单人歌手");
}else if(s instanceof Bands){
System.out.println("是乐队组合");
}else if(s instanceof Singer){
System.out.println("是Singer类型");
}
System.out.println(s);
}

session.getTransaction().commit();
session.close();
}


生成数据:



多了一个鉴别列type 用于标识每一行数据是对应那个实体..
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: