Hibernate继承关系的实体设计的两种方法
2015-09-09 15:48
381 查看
转载地址:http://blog.csdn.net/zhangtian_84fighting/article/details/1920956
1 对于父类和子类分别对应数据库中的一个表,父类表中的字段是公共的属性,子类表中是特殊的属性。
数据库表:
父表: titem 字段:id (id) name (名称) manufacturer (产地)
子表1:ibook 字段:id (id) pagecount(页数)
子表2:idvd 字段:id (id) regioncode (编号)
(1) 创建数据库:
--删除数据库表
droptable Titem;
droptable TBook;
droptable TDVD;
--创建数据库表
createtable Titem(
id varchar(32) notnullprimarykey,
namevarchar(20)notnull,
manufacturer varchar()
);
createtable TBook(
id varchar(32) notnullprimarykey,
pagecount int
);
createtable TDvd(
id varchar(32) notnullprimarykey,
regioncode varchar(2)
);
(2)编写类文件:
TItem类:
package hibernate.hbu;
publicclass TItem {
private String id;
private String name;
private String manufacturer;
public String getId() {
returnid;
}
publicvoid setId(String id) {
this.id =
id;
}
public String getManufacturer() {
returnmanufacturer;
}
publicvoid setManufacturer(String
manufacturer) {
this.manufacturer =
manufacturer;
}
public String getName() {
returnname;
}
publicvoid setName(String name)
{
this.name =
name;
}
}
TBook类:
package hibernate.hbu;
publicclass TBook extends TItem
{
privateintpagecount;
publicint getPagecount() {
returnpagecount;
}
publicvoid setPagecount(int pagecount)
{
this.pagecount =
pagecount;
}
}
TDvd类:
package hibernate.hbu;
publicclass TDvd extends TItem
{
private String regioncode;
public String getRegioncode() {
returnregioncode;
}
publicvoid setRegioncode(String
regioncode) {
this.regioncode =
regioncode;
}
}
(3)映射文件:titem.hbm.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">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="hibernate.zyl.TItem" table="titem" catalog="test">
<id name="id" type="java.lang.String">
<column name="id" length="32" />
<generator class="assigned" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="20" not-null="true" />
</property>
<property name="manufacturer" type="java.lang.String">
<column name="manufacturer" length="255" />
</property>
<joined-subclass name="hibernate.zyl.TBook" table="tbook">
<key column="id"></key>
<property name="pagecount" type="java.lang.Integer"
column="pagecount">
</property>
</joined-subclass>
<joined-subclass name="hibernate.zyl.TDvd" table="tdvd">
<key column="id"></key>
<property name="regioncode" type="java.lang.String"
column="regioncode">
</property>
</joined-subclass>
</class>
</hibernate-mapping>
(3)测试类: Test.java
package hibernate.zyl;
import hibernate.sessionFactory.HibernateSessionFactory;
import org.hibernate.Session;
import org.hibernate.Transaction;
publicclass Test {
/**
*@paramargs
*/
publicstaticvoid main(String[]
args) {
// TODO Auto-generated
method stub
Session session = HibernateSessionFactory.getSession();
Transaction tr = null;
// TDvd dvd = new TDvd();
// dvd.setId("001");
// dvd.setRegioncode("0");
// dvd.setManufacturer("hebei");
// dvd.setName("net");
// dvd.setRegioncode("6");
TBook book = new TBook();
book.setId("005");
book.setName("Java");
book.setManufacturer("机械工业");
book.setPagecount(66);
tr = session.beginTransaction();
// session.save(dvd);
session.save(book);
tr.commit();
}
}
2 在一个表中实现:
表: Titem 字段:id name category(特殊的标志位) manufacturer(产地)
pagecode(页数) regioncode(编号)
当category的值是1时,我们让此条记录指向一个TBook类,其中pagecode是具体的值,而regioncode的值是空的;当category的值是2时,我们让此条记录指向一个TDvd类,其中pagecode是空的,而regioncode的值是具体的值
(1) 创建数据库:
--删除数据库表
droptable Titem;
--创建数据库表
createtable Titem(
id varchar(32) notnullprimarykey,
namevarchar(20)notnull,
category varchar(50) notnull,
manufacturer varchar(50),
regioncode varchar(2),
pagecount int
);
(2) 编写类文件:
类文件的内容和前面的相同,不过要指出:虽然在表中增加了一个category字段但我们并不在类文件中增加这个属性,只是在映射文件中加以配置。
(3)映射文件:titem.hbm.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">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="hibernate.zyl.TItem" table="titem" catalog="test">
<id name="id" type="java.lang.String">
<column name="id" length="32" />
<generator class="assigned" />
</id>
<discriminator column="category" type="java.lang.String"
not-null="true" length="50">
</discriminator>
<property name="name" type="java.lang.String">
<column name="name" length="20" not-null="true" />
</property>
<property name="manufacturer" type="java.lang.String">
<column name="manufacturer" length="50" />
</property>
<subclass name="hibernate.zyl.TBook" discriminator-value="1">
<property name="pagecount" column="pagecount"
type="java.lang.Integer">
</property>
</subclass>
<subclass name="hibernate.zyl.TDvd" discriminator-value="2">
<property name="regioncode" column="regioncode"
type="java.lang.String">
</property>
</subclass>
</class>
</hibernate-mapping>
(3)测试类: Test.java
package hibernate.zyl;
import java.util.Iterator;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import sessionFactory.HibernateSessionFactory;
publicclass Test {
/**
*@paramargs
*/
publicstaticvoid main(String[]
args) {
// TODO Auto-generated
method stub
Session session = HibernateSessionFactory.getSession();
Transaction tr = null;
// TBook book = new TBook();
// book.setId("009");
// book.setName("Java");
// book.setManufacturer("石家庄");
// book.setPagecount(2);
// TDvd dvd = new TDvd();
// dvd.setId("012");
// dvd.setManufacturer("北京海淀");
// dvd.setName("Advd");
// dvd.setRegioncode("2");
// tr = session.beginTransaction();
// session.save(dvd);
// tr.commit();
TDvd dvd = null;
TItem item = null;
String hql = "from TItem t where t.id=?";
Query q = session.createQuery(hql);
q.setParameter(0, "012");
Iterator it = q.list().iterator();
while (it.hasNext()) {
dvd = (TDvd) it.next();
}
System.out.println(dvd.getManufacturer());
}
}
1 对于父类和子类分别对应数据库中的一个表,父类表中的字段是公共的属性,子类表中是特殊的属性。
数据库表:
父表: titem 字段:id (id) name (名称) manufacturer (产地)
子表1:ibook 字段:id (id) pagecount(页数)
子表2:idvd 字段:id (id) regioncode (编号)
(1) 创建数据库:
--删除数据库表
droptable Titem;
droptable TBook;
droptable TDVD;
--创建数据库表
createtable Titem(
id varchar(32) notnullprimarykey,
namevarchar(20)notnull,
manufacturer varchar()
);
createtable TBook(
id varchar(32) notnullprimarykey,
pagecount int
);
createtable TDvd(
id varchar(32) notnullprimarykey,
regioncode varchar(2)
);
(2)编写类文件:
TItem类:
package hibernate.hbu;
publicclass TItem {
private String id;
private String name;
private String manufacturer;
public String getId() {
returnid;
}
publicvoid setId(String id) {
this.id =
id;
}
public String getManufacturer() {
returnmanufacturer;
}
publicvoid setManufacturer(String
manufacturer) {
this.manufacturer =
manufacturer;
}
public String getName() {
returnname;
}
publicvoid setName(String name)
{
this.name =
name;
}
}
TBook类:
package hibernate.hbu;
publicclass TBook extends TItem
{
privateintpagecount;
publicint getPagecount() {
returnpagecount;
}
publicvoid setPagecount(int pagecount)
{
this.pagecount =
pagecount;
}
}
TDvd类:
package hibernate.hbu;
publicclass TDvd extends TItem
{
private String regioncode;
public String getRegioncode() {
returnregioncode;
}
publicvoid setRegioncode(String
regioncode) {
this.regioncode =
regioncode;
}
}
(3)映射文件:titem.hbm.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">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="hibernate.zyl.TItem" table="titem" catalog="test">
<id name="id" type="java.lang.String">
<column name="id" length="32" />
<generator class="assigned" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="20" not-null="true" />
</property>
<property name="manufacturer" type="java.lang.String">
<column name="manufacturer" length="255" />
</property>
<joined-subclass name="hibernate.zyl.TBook" table="tbook">
<key column="id"></key>
<property name="pagecount" type="java.lang.Integer"
column="pagecount">
</property>
</joined-subclass>
<joined-subclass name="hibernate.zyl.TDvd" table="tdvd">
<key column="id"></key>
<property name="regioncode" type="java.lang.String"
column="regioncode">
</property>
</joined-subclass>
</class>
</hibernate-mapping>
(3)测试类: Test.java
package hibernate.zyl;
import hibernate.sessionFactory.HibernateSessionFactory;
import org.hibernate.Session;
import org.hibernate.Transaction;
publicclass Test {
/**
*@paramargs
*/
publicstaticvoid main(String[]
args) {
// TODO Auto-generated
method stub
Session session = HibernateSessionFactory.getSession();
Transaction tr = null;
// TDvd dvd = new TDvd();
// dvd.setId("001");
// dvd.setRegioncode("0");
// dvd.setManufacturer("hebei");
// dvd.setName("net");
// dvd.setRegioncode("6");
TBook book = new TBook();
book.setId("005");
book.setName("Java");
book.setManufacturer("机械工业");
book.setPagecount(66);
tr = session.beginTransaction();
// session.save(dvd);
session.save(book);
tr.commit();
}
}
2 在一个表中实现:
表: Titem 字段:id name category(特殊的标志位) manufacturer(产地)
pagecode(页数) regioncode(编号)
当category的值是1时,我们让此条记录指向一个TBook类,其中pagecode是具体的值,而regioncode的值是空的;当category的值是2时,我们让此条记录指向一个TDvd类,其中pagecode是空的,而regioncode的值是具体的值
(1) 创建数据库:
--删除数据库表
droptable Titem;
--创建数据库表
createtable Titem(
id varchar(32) notnullprimarykey,
namevarchar(20)notnull,
category varchar(50) notnull,
manufacturer varchar(50),
regioncode varchar(2),
pagecount int
);
(2) 编写类文件:
类文件的内容和前面的相同,不过要指出:虽然在表中增加了一个category字段但我们并不在类文件中增加这个属性,只是在映射文件中加以配置。
(3)映射文件:titem.hbm.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">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="hibernate.zyl.TItem" table="titem" catalog="test">
<id name="id" type="java.lang.String">
<column name="id" length="32" />
<generator class="assigned" />
</id>
<discriminator column="category" type="java.lang.String"
not-null="true" length="50">
</discriminator>
<property name="name" type="java.lang.String">
<column name="name" length="20" not-null="true" />
</property>
<property name="manufacturer" type="java.lang.String">
<column name="manufacturer" length="50" />
</property>
<subclass name="hibernate.zyl.TBook" discriminator-value="1">
<property name="pagecount" column="pagecount"
type="java.lang.Integer">
</property>
</subclass>
<subclass name="hibernate.zyl.TDvd" discriminator-value="2">
<property name="regioncode" column="regioncode"
type="java.lang.String">
</property>
</subclass>
</class>
</hibernate-mapping>
(3)测试类: Test.java
package hibernate.zyl;
import java.util.Iterator;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import sessionFactory.HibernateSessionFactory;
publicclass Test {
/**
*@paramargs
*/
publicstaticvoid main(String[]
args) {
// TODO Auto-generated
method stub
Session session = HibernateSessionFactory.getSession();
Transaction tr = null;
// TBook book = new TBook();
// book.setId("009");
// book.setName("Java");
// book.setManufacturer("石家庄");
// book.setPagecount(2);
// TDvd dvd = new TDvd();
// dvd.setId("012");
// dvd.setManufacturer("北京海淀");
// dvd.setName("Advd");
// dvd.setRegioncode("2");
// tr = session.beginTransaction();
// session.save(dvd);
// tr.commit();
TDvd dvd = null;
TItem item = null;
String hql = "from TItem t where t.id=?";
Query q = session.createQuery(hql);
q.setParameter(0, "012");
Iterator it = q.list().iterator();
while (it.hasNext()) {
dvd = (TDvd) it.next();
}
System.out.println(dvd.getManufacturer());
}
}
相关文章推荐
- actionbar
- swift入门学习
- Android SurfaceView 实现Gif动画
- Unity 游戏开发技巧集锦之使用忍者飞镖创建粒子效果
- android两种签名
- iOS 时间戳
- win7下搭建pomelo方法
- 使用 Grunt, Gulp, Broccoli 或 Brunch 移除页面内无用的 CSS 样式
- ZOJ 3818(substr函数的使用)
- 0909 我与操作系统的第一次
- Spring MVC hello world example
- 解决Atom中文无法自动换行问题
- zabbix企业应用之监控动作是否有被关闭
- zabbix企业应用之监控动作是否有被关闭
- javascript学习
- MongoDB安装及使用
- 机器学习基石学习笔记3 VC Dimension(1)
- 从目录服务器中获取文件
- JQuery阻止冒泡事件on绑定中异常情况分析
- kmeans 初步学习小结