Есть ли способ в Hibernate для установки not-null в true при сохранении, но не при удалении в конфигурации сопоставления? - PullRequest
2 голосов
/ 25 декабря 2009
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.lexiclan.orm.dao">
 <class name="Address" table="ADDRESSES" lazy="false">
  <id name="addressId" column="ADDRESS_ID">
   <generator class="native" />
  </id>
  <many-to-one name="addressType" column="ADDRESS_TYPE_ID" not-null="true" class="AddressType" lazy="false" />
  <many-to-one name="contact" column="CONTACT_ID" not-null="true" class="Contact" lazy="false" />
  <property name="address1" column="ADDRESS_1" />
  <property name="address2" column="ADDRESS_2" />
  <property name="city" column="CITY" />
  <property name="stateProvince" column="STATE_PROVINCE" />
  <property name="zipPostalCode" column="ZIP_POSTAL_CODE" />
  <property name="countryRegion" column="COUNTRY_REGION" />
 </class>
</hibernate-mapping>

В этом примере для адреса требуется как контакт, так и отношение типа адреса, прежде чем вы сможете использовать «Session.save ()» (что я и хочу), но когда я хочу использовать «Session.delete ()» Я должен также указать контакт и тип адреса связи из-за ненулевого. Есть ли способ требовать эти значения при сохранении, но не при операциях обновления / удаления?

Ответы [ 3 ]

7 голосов
/ 25 декабря 2009

«not-null» не является условным ограничением. Либо ваши свойства (addressType / contact) ВСЕГДА обязательны для заполнения, в этом случае вы указываете их как not-null="true", либо они не являются.

«Иногда» совпадает с «не требуется». Если вам нужно выполнить условную проверку (например, во время вставки, но не во время обновления или на основе какого-либо другого состояния сущности), вы можете сделать это в своем коде до вызова методов сеанса или написать обработчик событий или перехватчик , чтобы сделать это за вас.

Тем не менее, удаление является особым случаем. session.delete() удаляет сохраненную сущность, что означает, что она уже была проверена и имеет свойства не равными NULL. Если вы хотите удалить по идентификатору (то есть у вас нет объекта, загруженного в сеансе), вы можете использовать session.load(), чтобы получить его прокси:

Address toBeDeleted = (Address) session.load(Address.class, id);
session.delete(toBeDeleted);

В любом случае, я не совсем уверен, что вы подразумеваете под "Я должен также указать контакт и тип адреса из-за ненулевого значения" в случае удаления. Вы не - они уже установлены; они были указаны при сохранении сущности.

1 голос
/ 25 декабря 2009

Я думаю, что не нуль - это ограничение базы данных. Почему бы вам не использовать оператор HQL, подобный приведенному ниже:

session.Delete("from Order o where o.Id = :Id", id, NHibernate.NHibernateUtil.Int32);

Таким образом, вам не нужен весь объект, чтобы удалить его из базы данных.

0 голосов
/ 25 декабря 2009

Я не нашел способа сделать это. Рассмотрите возможность использования другого ORM.

...