在Hibernate中是否有一种方法可以在保存时将not-null设置为true,但在映射配置中不能删除?

2 hibernate nullable

<?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>
Run Code Online (Sandbox Code Playgroud)

在这个例子中,地址需要联系人和地址类型关系才能使用"Session.save()"(这是我想要的),但是当我想使用"Session.delete()"时,我必须由于not-null,还指定了联系人和地址类型关系.有没有办法在保存时要求这些值,而不是在更新/删除操作上?

Chs*_*y76 7

"not-null"不是条件约束.您的属性(addressType/ contact)始终是必需的,在这种情况下,您将它们指定为not-null="true"或不是.

"有时"与"不需要"相同.如果您需要执行条件的验证(例如,在插入过程而不是更新过程中或基于其他一些实体状态),你可以先在调用会话的方法这样做在你的代码,或者你可以写一个事件侦听器拦截器来为你而做.

也就是说,删除是一种特殊情况.session.delete()删除持久化实体,这意味着它已经过验证并且其属性为非null.如果要按id删除(即,您没有在会话中加载实体),可以使用它session.load()来获取其代理:

Address toBeDeleted = (Address) session.load(Address.class, id);
session.delete(toBeDeleted);
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,我都不太清楚你的意思是"我必须指定一个联系和地址类型的关系因为非null",如果删除.你没有 - 他们已经定了; 它们是在实体持久化时指定的.