Table per concrete class方式:
TItem有兩個子類:TBook、TDVD。按照Table per concrete class方式,每個字類對應一張數據庫表。對應于TBook和TDVD,我們有以下庫表:
1.數據庫庫表
T_Book.sql
DROP
?
TABLE
?T_Book;
CREATE
?
TABLE
?T_Book?(
???????id?
INT
?
NOT
?
NULL
?AUTO_INCREMENT
?????,?name?
VARCHAR
(
50
)
?????,?manufacturer?
VARCHAR
(
50
)
?????,?pagecount?
INT
?????,?
PRIMARY
?
KEY
?(id)
);
T_DVD.sql
DROP?TABLE?T_DVD;
CREATE?TABLE?T_DVD?(
???????id?INT?NOT?NULL?AUTO_INCREMENT
?????,?name?VARCHAR(50)
?????,?manufacturer?VARCHAR(50)
?????,?regioncode?VARCHAR(30)
?????,?PRIMARY?KEY?(id)
);
2.配置文件
配置文件和普通配置文件沒有區(qū)別
TBook.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">
<hibernate-mapping?package="cn.blogjava.start">
????<class?name="TBook"?table="T_Book"?catalog="sample">
????????<id?name="id"?column="id"?type="java.lang.Integer">
????????????<generator?class="native"?/>
????????</id>
????????<property?name="name"?type="java.lang.String"?column="name"/>
????????<property?name="manufacturer"?type="java.lang.String"?column="manufacturer"/>????????
????????<property?name="pageCount"?type="java.lang.Integer"?column="pagecount"/>????????
????</class>
</hibernate-mapping>
TDVD.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">
<hibernate-mapping?package="cn.blogjava.start">
????<class?name="TDVD"?table="T_DVD"?catalog="sample">
????????<id?name="id"?column="id"?type="java.lang.Integer">
????????????<generator?class="native"?/>
????????</id>
????????<property?name="name"?type="java.lang.String"?column="name"/>
????????<property?name="manufacturer"?type="java.lang.String"?column="manufacturer"/>????????
????????<property?name="regionCode"?type="java.lang.String"?column="regioncode"/>????????
????</class>
</hibernate-mapping>
3.測試代碼
HibernateTest.java
package?cn.blogjava.start;
import?java.util.Iterator;
import?java.util.List;
import?junit.framework.Assert;
import?junit.framework.TestCase;
import?org.hibernate.HibernateException;
import?org.hibernate.Session;
import?org.hibernate.SessionFactory;
import?org.hibernate.Transaction;
import?org.hibernate.cfg.Configuration;
public?class?HibernateTest?extends?TestCase?{
????
????Session?session?=?null;
????/**
?????*?JUnit中的setUp方法在TestCase初始化的時候會自動調用
?????*?一般用于初始化公用資源
?????*/
????protected?void?setUp()?{
????????try?{
????????????/**
?????????????*?可以采用hibernate.properties或者hibernate.cfg.xml
?????????????*?配置文件的初始化代碼
?????????????*?
?????????????*?采用hibernate.properties
?????????????*?Configuration?config?=?new?Configuration();
?????????????*?config.addClass(TUser.class);
?????????????*/
????????????
????????????//采用hibernate.cfg.xml配置文件,與上面的方法對比,兩個差異
????????????//1.Configuration的初始化方式
????????????//2.xml
????????????Configuration?config?=?new?Configuration().configure();
????????????SessionFactory?sessionFactory?=?config.buildSessionFactory();
????????????session?=?sessionFactory.openSession();
????????????
????????}?catch?(HibernateException?e)?{
????????????//?TODO:?handle?exception
????????????e.printStackTrace();
????????}????????
????}
????/**
?????*?JUnit中的tearDown方法在TestCase執(zhí)行完畢的時候會自動調用
?????*?一般用于釋放資源
?????*/????
????protected?void?tearDown()?{
????????try?{
????????????session.close();????????
????????}?catch?(HibernateException?e)?{
????????????//?TODO:?handle?exception
????????????e.printStackTrace();
????????}????????
????}????
????
????/**
?????*?對象持久化測試(Insert方法)
?????*/????????
????public?void?testInsert()?{
????????Transaction?tran?=?null;
????????try?{
????????????tran?=?session.beginTransaction();
????????????TBook?book1?=?new?TBook();
????????????
????????????book1.setManufacturer("電子工業(yè)");
????????????book1.setName("Java?beginner");
????????????book1.setPageCount(501);
????????????
????????????TBook?book2?=?new?TBook();
????????????book2.setManufacturer("機械工業(yè)");
????????????book2.setName("Thinking?in?java");
????????????book2.setPageCount(1201);
????????????
????????????TDVD?dvd1?=?new?TDVD();
????????????dvd1.setManufacturer("columnibia");
????????????dvd1.setName("Lord?king");
????????????dvd1.setRegionCode("5?area");
????????????
????????????TDVD?dvd2?=?new?TDVD();
????????????dvd2.setManufacturer("sony");
????????????dvd2.setName("Forrest?gump");
????????????dvd2.setRegionCode("3?area");????????????
????????????session.save(book1);
????????????session.save(book2);
????????????session.save(dvd1);
????????????session.save(dvd2);
????????????session.flush();
????????????tran.commit();
????????????Assert.assertEquals(book1.getId().intValue()>0,?true);
????????????Assert.assertEquals(book2.getId().intValue()>0,?true);
????????????Assert.assertEquals(dvd1.getId().intValue()>0,?true);
????????????Assert.assertEquals(dvd2.getId().intValue()>0,?true);
????????}?catch?(HibernateException?e)?{
????????????//?TODO:?handle?exception
????????????e.printStackTrace();
????????????Assert.fail(e.getMessage());
????????????if(tran?!=?null)?{
????????????????try?{
????????????????????tran.rollback();
????????????????}?catch?(Exception?e1)?{
????????????????????//?TODO:?handle?exception
????????????????????e1.printStackTrace();
????????????????}
????????????}
????????}
????}
????
????/**
?????*?對象讀取測試(Select方法)
?????*/????????????
????public?void?testSelect(){
????????//指定了具體父類,如果是from TItem,是會失敗的。
????????List?list?=?session.createQuery("?from?cn.blogjava.start.TItem").list();
????????
????????Iterator?it?=?list.iterator();
????????while?(it.hasNext())?{
????????????TItem?item?=?(TItem)it.next();
????????????System.out.println(item.getName());
????????????
????????}
????}
}
posted on 2006-07-05 15:00
knowhow 閱讀(290)
評論(0) 編輯 收藏 所屬分類:
ORM:Hibernate及其他