Спящий ленивый = ложь влияет на удаление - PullRequest
0 голосов
/ 13 апреля 2011

Я пытаюсь настроить проект, используя hibernate. У меня есть две таблицы: Users и Address со следующими сопоставлениями:

<?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 = false, я получаю ошибку при удалении: удаленный объект будет повторно сохранен каскадом

и я установил lazy = true, тогда я не смогу получить доступ к своим объектам из-за отложенных ошибок инициализации.

Любая помощь приветствуется.

Thx.

1 Ответ

1 голос
/ 13 апреля 2011

Вам необходимо удалить Usr из соответствующего Address.usrs перед удалением его из базы данных.В противном случае Hibernate пытается повторно сохранить его путем каскадирования, поскольку usrs настроен как cascade="all-delete-orphan".

С lazy = "true" у вас нет этой проблемы, поскольку каскадирование не применяется к неинициализированным ленивым коллекциям.

Кроме того, объявление всех отношений как активных не всегда является хорошим решением для проблем с отложенной инициализацией.,Другие возможные решения включают шаблон Open Session in View и тонкую настройку стратегии выборки с join fetch и т. Д.

...