最近用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()也可以重新关联对象,可是要写在事务中吗?上面的方法开启一个事务不用关闭岂不是很占资源?关闭了不是又出错?请高手解释一下,小弟拜谢!!!!