Hibernate继承和聚合的实现
Hibernate中继承和聚合的实现分别是通过subclass元素和component元素实现的。
关于subclass/joined-sunclass/union-subclass元素实现继承介绍请参考文档《Hibernate三种继承关系》链接:http://blog.csdn.net/pursuer211/article/details/17318379
下面着重介绍下component元素的使用:
首先描述一下实例场景:
以人Person作为实体,他包含姓名、性别和联系方式等,其中联系方式又包括电话和地址,所以我们可以把联系方式再抽象成一个实体,就叫联系方式Contract。如下图:
表t_person结构如下:
Ø Person.hbm.xml
<hibernate-mapping
package="com.red.bean">
<classname="Person"table="t_person">
<id name="id"column="id"type="integer">
<generator class="increment"></generator>
</id>
<propertyname="name"
column="name"
type="string"/>
<property name="sex"
column="sex"
type="string"/>
<component name="contract"
class="Contract">
<property name="tel"
column="tel"
type="string"/>
<property name="address"
column="address"
type="string"/>
</component>
</class>
</hibernate-mapping>
Ø Contract.java
package com.red.bean;
import java.io.Serializable;
publicclass Contractimplements Serializable {
privatestaticfinallongserialVersionUID = 1L;
private Stringtel ="";
private Stringaddress ="";
public String getTel() {
returntel;
}
publicvoid setTel(String tel) {
this.tel = tel;
}
public String getAddress() {
returnaddress;
}
publicvoid setAddress(String address) {
this.address = address;
}
}
Ø Person.java
package com.red.bean;
import java.io.Serializable;
publicclass Personimplements Serializable {
privatestaticfinallongserialVersionUID = 1L;
private Integerid = 0;
private Stringname ="";
private Stringsex ="";
private Contractcontract =null;
public Integer getId() {
returnid;
}
publicvoid setId(Integer id) {
this.id = id;
}
public String getName() {
returnname;
}
publicvoid setName(String name) {
this.name = name;
}
public String getSex() {
returnsex;
}
publicvoid setSex(String sex) {
this.sex = sex;
}
public Contract getContract() {
returncontract;
}
publicvoid setContract(Contract contract) {
this.contract = contract;
}
}
Ø TestPersonCase.java
package com.red.test;
import java.util.Iterator;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.red.bean.Contract;
import com.red.bean.Person;
import junit.framework.TestCase;
publicclass TestPersonCaseextends TestCase {
private Sessionsession =null;
private SessionFactorysf =null;
protectedvoid setUp()
{
try
{
Configuration cfg = new Configuration();
sf = cfg.configure().buildSessionFactory();
session = sf.openSession();
}
catch( HibernateException e)
{
e.printStackTrace();
}
}
protectedvoid tearDown()
{
try
{
session.close();
sf.close();
}
catch(HibernateException e)
{
e.printStackTrace();
}
}
publicvoid testInsert()
{
try
{
Contract contract = new Contract();
contract.setTel("13888888888");
contract.setAddress("四川省成都市");
Person person = new Person();
person.setName("zhanshan");
person.setSex("1");
person.setContract(contract);
session.beginTransaction();
session.save(person);
session.getTransaction().commit();
}
catch (HibernateException e)
{
e.printStackTrace();
}
}
publicvoid testSelect()
{
String personhql = "from com.red.bean.Person";
Query query = null;
List ls = null;
Iterator it = null;
try
{
query = session.createQuery(personhql);
ls = query.list();
if (null == ls || ls.isEmpty())
{
return;
}
it = ls.iterator();
Person person = null;
while (it.hasNext())
{
person = (Person) it.next();
System.out.println("-----Person name:" + person.getName());
}
}
catch(HibernateException e)
{
e.printStackTrace();
}
}
}
执行TestPersonCase类,控制台打印的结果如下:
17:33:00,709 DEBUG SQL:393 - select max(id) from t_person
17:33:00,788 DEBUG SQL:393 - insert into t_person (name, sex, tel, address, id) values (?, ?, ?, ?, ?)
17:33:01,147 DEBUG SQL:393 - select person0_.id as id8_, person0_.name as name8_, person0_.sex as sex8_, person0_.tel as tel8_, person0_.address as address8_ from t_person person0_
-----Person name:zhanshan
查看表数据
select *fromt_person;