Hibernate之容器映射 Set映射

追求 2010-05-24

Hibernate之容器映射

Set映射两张表对应一个类

CREATETABLEperson

(

idINTidentity(1,1)NOTNULLPRIMARYKEY,

nameVARCHAR(100)NOTNULL

);

CREATETABLEemails

(

idINTNOTNULL,

addressVARCHAR(100)NOTNULL

);

一条person记录对应多条email记录,我们用set,因为元素不重复.

publicclassPerson

{

privateIntegerid;

privateStringname;

//一个人拥有多个不同的email地址

privateSetemails;

getter和setter

}

从person表创建映射

映射文件为

<hibernate-mapping>

<classname="com.zhv.pojo.Person"table="person"catalog="bbs">

<idname="id"type="integer">

<columnname="id"/>

<generatorclass="native"></generator>

</id>

<propertyname="name"type="string">

<columnname="name"length="100"not-null="true"/>

</property>

</class>

</hibernate-mapping>

应当对这个文件进行修改

在person表中加入Set集合,集合内容为emails表中全部数据

<setname="emails"table="eails">//对应Person类中字段,表是emails表

<keycolumn="id"></key>//按照id关联

<elementtype="java.lang.String"column="address"></element>

//集合email中的元素是对应address字段,为String类型

</set>

这样就可以通过person一个类来操作两张表

publicstaticvoidmain(String[]args)

{

Personp=newPerson();

p.setName("李杏花");

Setset=newTreeSet();

set.add("abc@126.com");

set.add("def@263.net");

set.add("seg@tom.com");

p.setEmails(set);

PersonOperpo=newPersonOper();

po.insert(p);

}

Hibernate:insertintobbs.person(name)values(?)

Hibernate:insertintoemails(id,address)values(?,?)

Hibernate:insertintoemails(id,address)values(?,?)

Hibernate: insert into emails (id, address) values (?, ?)

在 Hibernate3中,有延迟加载机制.所谓的延迟加载就是指当程序用到数据的时候才自行加载.

publicPersonqueryById(intid)

{

Personp=null;

Stringhql="FROMPersonaspwherep.id=?";

Queryq=this.session.createQuery(hql);

q.setInteger(0,id);

Iteratoritr=q.list().iterator();

if(itr.hasNext())

{

p=(Person)itr.next();

}

this.session.close();

returnp;

}

publicstaticvoidmain(String[]args)

{

PersonOperpo=newPersonOper();

Personp=po.queryById(1);

System.out.println(p.getName());

  System.out.println(p.getEmails());

 }

报错!

failedtolazilyinitializeacollectionofrole:com.zhv.pojo.Person.emails-nosessionorsessionwasclosed

就是因为延迟加载

实际执行SQL语句为

Hibernate:selectperson0_.idasid,person0_.nameasname0_frombbs.personperson0_whereperson0_.id=?

根本就没有执行对emails表的查询。

设置就在set的lazy属性中,默认是true。

如果不关闭session就没有问题了。

当设置为false的时候,就可以查出来

Hibernate:selectperson0_.idasid,person0_.nameasname0_frombbs.personperson0_whereperson0_.id=?

Hibernate:selectemails0_.idasid0_,emails0_.addressasaddress0_fromemailsemails0_whereemails0_.id=?

上来就卡插卡插都给查出来了。

Hibernate中提供的delete方法最大缺点就是必须首先把数据查询出来在进行删除,最好的做法是将数据按照id进行删除,but按照id删除,必须使用hql,但是hql能删除person,不能删除emails,最好的方法是在数据库里面加入外键foreign key,让数据库自己进行表的维护。

相关推荐

ganyouxianjava / 0评论 2012-05-31