2011-04-13 68 views
0

我试图用hibernate.I建立一个项目有两个表:用户和通过以下映射地址:休眠懒惰=假影响删除

<?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="Address" table="ADDRESS" > 
     <cache usage="read-write"/> 
     <id name="addressId" type="long"> 
      <column name="ADDRESS_ID" precision="22" scale="0" /> 
      <generator class="increment" /> 
     </id> 
     <property name="street" type="string"> 
      <column name="STREET" length="50" /> 
     </property> 
     <property name="city" type="string"> 
      <column name="CITY" length="20" /> 
     </property> 
     <set name="usrs" inverse="true" cascade="all-delete-orphan"> 
      <key> 
       <column name="ADDRESS_ID" precision="22" scale="0" not-null="true"/> 
      </key> 
      <one-to-many class="Usr" /> 
     </set> 
    </class> 


</hibernate-mapping> 

<?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="Usr" table="USR" > 
     <cache usage="read-write"/> 
     <id name="usrId" type="long"> 
      <column name="USR_ID" precision="22" scale="0" /> 
      <generator class="increment" /> 
     </id> 
     <many-to-one name="address" class="Address" > 
      <column name="ADDRESS_ID" precision="22" scale="0" /> 
     </many-to-one> 
     <property name="logname" type="string"> 
      <column name="LOGNAME" length="20" not-null="true" /> 
     </property> 
     <property name="password" type="string"> 
      <column name="PASSWORD" length="20" not-null="true" /> 
     </property> 
    </class> 

    <query name="Usr.by.city"> 
     <![CDATA[ 
      FROM rUsr as u   
      WHERE u.address.city = :city 
     ]]> 
    </query> 
</hibernate-mapping> 

如果我设置为lazy =假,我得到一个删除时出错: 删除的对象将被级联重新保存

我设置了lazy = true,那么由于延迟初始化错误,我将无法访问我的对象。

任何帮助表示赞赏。

Thx。

回答

1

在将其从数据库中删除之前,您需要从相应的Address.usrs中删除Usr。否则,Hibernate尝试通过级联重新保存它,因为usrs被配置为cascade="all-delete-orphan"

随着lazy = "true"你没有这个问题,因为级联不适用于未初始化的惰性集合。

此外,将所有关系声明为渴望并不总是解决懒惰初始化问题的好方法。其他可能的解决方案包括Open Session in View pattern以及使用join fetch等进行的细粒度获取策略调整。

+0

非常感谢axtavt。 – Sergiu 2011-04-13 14:16:50