« | September 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | | | | |
| 公告 |
|
Blog信息 |
blog名称:流浪狗 日志总数:44 评论数量:19 留言数量:-2 访问次数:191646 建立时间:2008年3月13日 |

| |
[Hibernate]Hibernate 实体层设计 软件技术
流浪狗 发表于 2008/3/14 10:51:15 |
设计三个表TItem ,TBook 和TDVD ,TItem 存放明细,TBook存放书籍页数,TDVD存放DVD本数,TItem 和TBook ,TDVD 之间用id相关联
-- 删除表DROP TABLE TItem ;
DROP TABLE TBook ;
DROP TABLE TDVD ;
-- 创建表CREATE TABLE TItem( id varchar(32) not null primary key , name varchar(20) not null , manufacturer varchar(20)) ;
CREATE TABLE TBook( id varchar(32) not null primary key , pagecount int ) ;
CREATE TABLE TDvd( id varchar(32) not null primary key , regioncode varchar(2)) ;
-- 事务提交commit ;
每个表对应一个类\
TItem.java
package org.cool.hibernate.demo03;
public class TItem { private String id ; private String name ; private String manufacturer ; /** * @return the id */ public String getId() { return id; } /** * @param id the id to set */ public void setId(String id) { this.id = id; } /** * @return the manufacturer */ public String getManufacturer() { return manufacturer; } /** * @param manufacturer the manufacturer to set */ public void setManufacturer(String manufacturer) { this.manufacturer = manufacturer; } /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; }}
TBook.java
package org.cool.hibernate.demo03;
public class TBook extends TItem{ private int pageCount ;
/** * @return the pageCount */ public int getPageCount() { return pageCount; }
/** * @param pageCount the pageCount to set */ public void setPageCount(int pageCount) { this.pageCount = pageCount; }}
TDVD.java
package org.cool.hibernate.demo03;
public class TDVD extends TItem{ private String regionCode ;
/** * @return the regionCode */ public String getRegionCode() { return regionCode; }
/** * @param regionCode the regionCode to set */ public void setRegionCode(String regionCode) { this.regionCode = regionCode; } }
配置文件Titem.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"><!-- Mapping file autogenerated by MyEclipse - Hibernate Tools--><hibernate-mapping> <class name="org.cool.hibernate.demo03.TItem" table="titem" catalog="mydatabase"> <id name="id" type="string"> <column name="id" length="32" /> <generator class="assigned" /> </id> <property name="name" type="string"> <column name="name" length="20" not-null="true" /> </property> <property name="manufacturer" type="string"> <column name="manufacturer" length="20"></column> </property>
<joined-subclass name="org.cool.hibernate.demo03.TBook" table="TBook"> <key column="ID"></key> <property name="pageCount" type="java.lang.Integer" column="pagecount"> </property> </joined-subclass> <joined-subclass name="org.cool.hibernate.demo03.TDVD" table="TDvd"> <key column="ID"></key> <property name="regionCode" type="java.lang.String" column="regioncode"> </property> </joined-subclass> </class></hibernate-mapping>
操作类TItemOperate.java
package org.cool.hibernate.demo03;
import java.util.Iterator;
import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;
public class TItemOperate { private Session session ; public TItemOperate() { Configuration config = new Configuration().configure() ; SessionFactory factory = config.buildSessionFactory() ; this.session = factory.openSession() ; } // 增加操作,增加书或DVD // TBook和TDVD都是TItem的子类 public void insert(TItem item) { this.session.save(item) ; this.session.beginTransaction().commit() ; this.session.close() ; } // 进行按ID查询操作 public TItem queryById(String id) { TItem item = null ; String hql = "FROM TItem AS t WHERE t.id=?" ; Query q = this.session.createQuery(hql) ; q.setString(0,id) ; Iterator iter = q.list().iterator() ; if(iter.hasNext()) { item = (TItem)iter.next() ; } return item ; }}
测试类TestDemo03.java
package org.cool.hibernate.demo03;
public class TestDemo03 {
/** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub TItemOperate to = new TItemOperate() ; TBook book = new TBook() ; book.setId("ml001") ; book.setName("JAVA EE从入门到精通") ; book.setManufacturer("魔乐在线") ; book.setPageCount(888) ; /* TDVD dvd = new TDVD() ; dvd.setId("lxh002") ; dvd.setName("JAVA EE学习视频") ; dvd.setManufacturer("MLDN") ; dvd.setRegionCode("6") ; */ // 向数据库中执行插入操作 to.insert(book) ; // TBook book = (TBook)to.queryById("ml001") ;// System.out.println(book.getName()) ; }
}
执行插入TBook以后,发现在TItem和TBook中都有了数据,在插入TDVD的时候也是TItem和TDVD都有了数据全是贴的代码,其实主要就是配置文件中的颜色文字那块
将以上的三个表合成为一个表
-- 删除表DROP TABLE TItem ;
-- 创建表CREATE TABLE TItem( id varchar(32) not null primary key , -- 通过此字段用于区分保存的是 Book还是 DVD category varchar(2) not null , name varchar(20) not null , manufacturer varchar(20) not null , regionCode varchar(2) , pageCount int ) ;
-- 事务提交commit ;
category 这个字段很特别,把上面的TItem,TBook,TDVD,TItemOperate,TestDemo03原样复制过来
配置文件Titem.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"><!-- Mapping file autogenerated by MyEclipse - Hibernate Tools--><hibernate-mapping package="org.cool.hibernate.demo04"> <class name="TItemDemo" table="titemdemo" catalog="mydatabase"> <id name="id" type="string"> <column name="id" length="32" /> <generator class="assigned" /> </id> <discriminator column="category" type="string"></discriminator> <property name="name" type="string"> <column name="name" length="20" not-null="true" /> </property> <property name="manufacturer" type="string"> <column name="manufacturer" length="20" not-null="true" /> </property> <subclass name="org.cool.hibernate.demo04.TBook" discriminator-value="1"> <property name="pageCount" type="integer"> <column name="pageCount" /> </property> </subclass> <subclass name="org.cool.hibernate.demo04.TDVD" discriminator-value="2"> <property name="regionCode" type="string"> <column name="regionCode" length="2" /> </property> </subclass> </class></hibernate-mapping>这样在运行测试程序TestDemo03.java的插入操作时,发现插入TBook的时候category字段的值是1,二插入TDVD的时候category字段的值是2
Table per subclass每一个子类对应一张子表,并与主类共享主表
Table per class hierarchy表与类的一对多关系
|
|
|