针对每个实体所涉及到的具体属性不同的特点,比如一个商品类中,书本有页数属性,DVD有区码属性,如果针对不同的对象建一张独立的表
不行。可以把不同对象相同的地方归类到一个公共类,然后用Table per subclass来处理,具体如下
针对不同对象不同属性先分别建不同对象特有属性的子表,字段只是特有属性就OK
然后在公共类的映射文件中用<joined-subclass
name="子类具体路径"
table="对应子表">
<key column="id"/>
<property name="pageCount"
column="pagecount">
</joined-subclass>
然后写如下测试代码:
TBook book=new TBook();
book.setpagecount(23);
book.setName("NO excuse");
TDvd dvd=new TDvd();
dve.setName(spain man );
dve.setRegioncode(6);
try{
Transaction tx=session.beginTransaction();
session.save(book);
session.save(dvd);
tx.commit();
}
catch(HibarnateException e)
{
......
}
不过有一种更好的区别子类的方法
在主表中增加一个Category字段用来标示字类,
假如category=1表示的是书
category=2表示的DVD
那么在Hibernate 映射文件中的discriminator节点,则可以定义根据category自动识别对应的class类型的功能。
注意。是自动的,以下代码你就知道了。
在TItem.hbm.xml
<hibernate-mapping>
<class name="item类的具体路径 table="T_ITEM">
<id name="id" column="id">
<generator class="native"/>
</id>
<discriminator column="category" type="string"/ >
<property name="name" column="name">
<property 其他公共部分的属性>
<subclass name="字类的具体路径(注意是个真实的类)" discriminator-value="1">
<property name="pageCount" column="pagecount"/><!--对应的字类特殊字段,也就是说这个是我字类特有的属性了-->
</subclass>
<subclass name="字类的具体路径" discriminator-value="2">
<property name="Code" column="code"/>
</subclass>
</hibernate-mapping>
这样,在运行Hibernate读取T_ITEM表数据时,会根据指定的category来进行判断,如果category字段值为1,则映射到
TBook。如果是2则把数据映射到TDVD生成实例对象。
然后看下测试类
List list =session.createQuery("from TBook").list();
Iterator it=list.iterator();
while(it.hasNext())
{
TBook book=(TBook)it.next();
System.out.println(book.getName());
}
输出来的真的是book里面的Name哦。。。这种方法近似于父类和其子类映射的解决之道,既一个大类对应有一个大表
,大表有些属性是字类特有的,通过category来识别加载子类。