最近用struts+hibernate开发,发现问题;因为程序中的pets对象已经脱管,所以用PetsDAO中的方法重新关联:
PetsDAO中的方法:
public Pets cxPets(Pets pets){
Session session = getSession();
Transaction tx = session.beginTransaction();
session.update(pets);
Hibernate.initialize(pets.getOwners());
Hibernate.initialize(pets.getTypes());
Hibernate.initialize(pets.getVisitses());
Hibernate.initialize(pets.getOwners().getPetses());
Hibernate.initialize(pets.getTypes().getPetses());
tx.commit();
closeSession();
return pets;
}
Pets.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">
<!--
Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
<class name="cn.Pets" table="pets" schema="dbo" catalog="petsclinic">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native" />
</id>
<many-to-one name="types" class="cn.Types" fetch="select">
<column name="tid" not-null="true" />
</many-to-one>
<many-to-one name="owners" class="cn.Owners" fetch="select">
<column name="oid" not-null="true" />
</many-to-one>
<property name="name" type="java.lang.String">
<column name="name" length="30" not-null="true" />
</property>
<property name="birthday" type="java.util.Date">
<column name="birthday" length="23" not-null="true" />
</property>
<set name="visitses" inverse="true">
<key>
<column name="pid" not-null="true" />
</key>
<one-to-many class="cn.Visits" />
</set>
</class>
</hibernate-mapping>
查询程序中的PetsAction中调用
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
PetsForm petsForm = (PetsForm) form;
String name=petsForm.getName();
Pets pets=null;
PetsDAO pd=new PetsDAO();
pets=pd.getPetsByname(name);
if(pets!=null){
pets=pd.cxPets(pets);
Integer pid=pets.getId();
request.setAttribute("pid", pid);
String ptypes=pets.getTypes().getName();
ptypes=new String(ptypes.getBytes("ISO-8859-1"), "gbk");
request.setAttribute("ptypes", ptypes);
String powners=pets.getOwners().getName();
powners=new String(powners.getBytes("ISO-8859-1"), "gbk");
request.setAttribute("powners", powners);
String ppname=pets.getName();
ppname=new String(ppname.getBytes("ISO-8859-1"), "gbk");
request.setAttribute("ppname", ppname);
Date pbirthday=pets.getBirthday();
request.setAttribute("pbirthday", pbirthday);
Set visits=pets.getVisitses();
HttpSession session=request.getSession();
session.setAttribute("visits", visits);
return mapping.findForward("cg");
}else{
return mapping.findForward("errors");
}
}
奇怪的是,我要查询某个pets的name,在数据库中我的pets表中的相应name字段的中文记录突然变成乱码,如果是英文记录的名称就没有任何问题,是不是那个Hibernate.initialize方法出的问题,另外我的程序中设置了过滤器,把每一次请求的编码改为gbk了,这个有影响吗?请高手帮解决
还想问一下, merge()方法的作用,
public Pets merge(Pets detachedInstance) {
log.debug("merging Pets instance");
try {
Pets result = (Pets) getSession()
.merge(detachedInstance);
log.debug("merge successful");
return result;
} catch (RuntimeException re) {
log.error("merge failed", re);
throw re;
}
}
我知道 merge()也可以重新关联对象,可是要写在事务中吗?上面的方法开启一个事务不用关闭岂不是很占资源?关闭了不是又出错?请高手解释一下,小弟拜谢!!!!
PetsDAO中的方法:
public Pets cxPets(Pets pets){
Session session = getSession();
Transaction tx = session.beginTransaction();
session.update(pets);
Hibernate.initialize(pets.getOwners());
Hibernate.initialize(pets.getTypes());
Hibernate.initialize(pets.getVisitses());
Hibernate.initialize(pets.getOwners().getPetses());
Hibernate.initialize(pets.getTypes().getPetses());
tx.commit();
closeSession();
return pets;
}
Pets.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">
<!--
Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
<class name="cn.Pets" table="pets" schema="dbo" catalog="petsclinic">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native" />
</id>
<many-to-one name="types" class="cn.Types" fetch="select">
<column name="tid" not-null="true" />
</many-to-one>
<many-to-one name="owners" class="cn.Owners" fetch="select">
<column name="oid" not-null="true" />
</many-to-one>
<property name="name" type="java.lang.String">
<column name="name" length="30" not-null="true" />
</property>
<property name="birthday" type="java.util.Date">
<column name="birthday" length="23" not-null="true" />
</property>
<set name="visitses" inverse="true">
<key>
<column name="pid" not-null="true" />
</key>
<one-to-many class="cn.Visits" />
</set>
</class>
</hibernate-mapping>
查询程序中的PetsAction中调用
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
PetsForm petsForm = (PetsForm) form;
String name=petsForm.getName();
Pets pets=null;
PetsDAO pd=new PetsDAO();
pets=pd.getPetsByname(name);
if(pets!=null){
pets=pd.cxPets(pets);
Integer pid=pets.getId();
request.setAttribute("pid", pid);
String ptypes=pets.getTypes().getName();
ptypes=new String(ptypes.getBytes("ISO-8859-1"), "gbk");
request.setAttribute("ptypes", ptypes);
String powners=pets.getOwners().getName();
powners=new String(powners.getBytes("ISO-8859-1"), "gbk");
request.setAttribute("powners", powners);
String ppname=pets.getName();
ppname=new String(ppname.getBytes("ISO-8859-1"), "gbk");
request.setAttribute("ppname", ppname);
Date pbirthday=pets.getBirthday();
request.setAttribute("pbirthday", pbirthday);
Set visits=pets.getVisitses();
HttpSession session=request.getSession();
session.setAttribute("visits", visits);
return mapping.findForward("cg");
}else{
return mapping.findForward("errors");
}
}
奇怪的是,我要查询某个pets的name,在数据库中我的pets表中的相应name字段的中文记录突然变成乱码,如果是英文记录的名称就没有任何问题,是不是那个Hibernate.initialize方法出的问题,另外我的程序中设置了过滤器,把每一次请求的编码改为gbk了,这个有影响吗?请高手帮解决
还想问一下, merge()方法的作用,
public Pets merge(Pets detachedInstance) {
log.debug("merging Pets instance");
try {
Pets result = (Pets) getSession()
.merge(detachedInstance);
log.debug("merge successful");
return result;
} catch (RuntimeException re) {
log.error("merge failed", re);
throw re;
}
}
我知道 merge()也可以重新关联对象,可是要写在事务中吗?上面的方法开启一个事务不用关闭岂不是很占资源?关闭了不是又出错?请高手解释一下,小弟拜谢!!!!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货