#hibernate #cascade
#переход в спящий режим #каскад
Вопрос:
Я пытаюсь настроить проект, используя спящий режим.У меня есть две таблицы: Пользователи и адреса со следующими сопоставлениями :
<?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, тогда я не смогу получить доступ к своим объектам из-за ошибок отложенной инициализации.
Приветствуется любая помощь.
Спасибо.
Ответ №1:
Вам необходимо удалить Usr
из соответствующего Address.usrs
, прежде чем удалять его из базы данных. В противном случае Hibernate попытается повторно сохранить его с помощью каскадирования, поскольку usrs
настроен как cascade="all-delete-orphan"
.
С lazy = "true"
у вас нет этой проблемы, поскольку каскадирование не применяется к неинициализированным отложенным коллекциям.
Кроме того, объявление всех отношений как нетерпеливых не всегда является хорошим решением проблем с отложенной инициализацией. Другие возможные решения включают в себя шаблон открытого сеанса в представлении и тонкую настройку стратегии выборки с помощью join fetch
и так далее.