每一个实体一张表
<?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 用于标识每一行数据是对应那个实体..