显示多态声明的类只有在明确指定其类名的时候才能实例化得到其对应的类对象polymorphism=“explicit”;
Java中个继承关系反应在hibernate的orm映射中的表现形式:最佳的方法是table per class hierarchy有利于高并发量的存取。相对于使用外键关联的父子类具有更高的使用效率,避免了多表查询。相对于使用每个子类一张表的模式使用显示多态的方法,如果父类改动的话那么子类必须也要改变,这样会造成连带影响。
使用table per class hierarchy模式用法如下:
Item类:
package com.inspur.po;
import java.io.Serializable;
public class TItem implements Serializable{
private int id;
private String name;
private String manufacturer;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getManufacturer() {
return manufacturer;
}
public void setManufacturer(String manufacturer) {
this.manufacturer = manufacturer;
}
public TItem(int id, String name, String manufacturer) {
this.id = id;
this.name = name;
this.manufacturer = manufacturer;
}
public TItem() {
}
}
TBook类代码:
package com.inspur.po;
public class TBook extends TItem{
private int pageCount;
public int getPageCount() {
return pageCount;
}
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}
public TBook(int id, String name, String manufacturer, int pageCount) {
super(id, name, manufacturer);
this.pageCount = pageCount;
}
public TBook() {
}
}
TDvd类代码如下:
package com.inspur.po;
public class TDvd extends TItem{
private String regionCode;
public String getRegionCode() {
return regionCode;
}
public void setRegionCode(String regionCode) {
this.regionCode = regionCode;
}
public TDvd(int id, String name, String manufacturer, String regionCode) {
super(id, name, manufacturer);
this.regionCode = regionCode;
}
public TDvd() {
}
}
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">
<hibernate-mapping>
<class name="com.inspur.po.TItem" table="t_item">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<discriminator column="category" type="string"></discriminator>
<property name="name" column="name" type="string"></property>
<property name="manufacturer" column="manufacturer" type="string"></property>
<subclass name="com.inspur.po.TBook" discriminator-value="2">
<property name="pageCount" column="pageCount"></property>
</subclass>
<subclass name="com.inspur.po.TDvd" discriminator-value="1">
<property name="regionCode" column="regionCode"></property>
</subclass>
</class>
</hibernate-mapping>
Test类代码:
package com.inspur.test;
import java.util.Iterator;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.inspur.po.TBook;
import com.inspur.po.TDvd;
import junit.framework.TestCase;
public class Test extends TestCase {
Session session=null;
@Override
protected void setUp() throws Exception {
Configuration config=new Configuration().configure();
SessionFactory sessionFactory=config.buildSessionFactory();
session=sessionFactory.openSession();
}
@Override
protected void tearDown() throws Exception {
session.close();
}
public void testLoad(){
TDvd dvd=null;
List list=session.createQuery("from TDvd").list();
Iterator it=list.iterator();
while(it.hasNext()){
dvd=(TDvd)it.next();
System.out.println(dvd.getName());
}
}
public void testInsert(){
TDvd dvd=new TDvd();
dvd.setManufacturer("英皇");
dvd.setName("再不疯狂我们就老了");
dvd.setRegionCode("5");
Transaction tran=null;
try{
tran=session.beginTransaction();
session.save(dvd);
session.flush();
tran.commit();
}catch(HibernateException e){
if(tran!=null){
try{
tran.rollback();
}catch(HibernateException e1){
e1.printStackTrace();
}
}
e.printStackTrace();
}
}
}