根据one-to-many
xml映射标记的Hibernate文档,有一个名为not-found
的属性
http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/collections.html#collections-onetomany
Doc说:
not-found(可选 - 默认为exception):指定缓存的方式 将处理引用缺失行的标识符。忽略意志 将缺失的行视为空关联。
这个属性有什么用?我试图在Product和Parts之间创建一个映射,Product有一组零件,下面有映射细节:
<set name="parts" cascade="all">
<key column="productSerialNumber" not-null="true" />
<one-to-many class="Part" not-found="ignore"/>
</set>
然后我将我的Java代码编写为:
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Product prod = (Product) session.get(Product.class, 1);
session.getTransaction().commit();
System.out.println(prod);
HibernateUtil.getSessionFactory().close();
}
我期待我的设置为null,其中包含我在映射文件中配置为not-found="ignore"
的部件。但我得到了常规例外 - org.hibernate.LazyInitializationException
请帮助我了解这个属性的用途是什么?什么是缓存标识符?
答案 0 :(得分:7)
未找到与延迟加载无关。它用于处理数据库中的不一致性。
假设您对良好的数据库实践一无所知,并且有一个包含order_line
列的order_id
表,该列应该引用它所属的order
。并且假设由于您对良好实践一无所知,因此您对此列没有外键约束。
因此,即使订单具有引用它的订单行,也可以删除订单。当使用Hibernate加载这样的OrderLine时,Hibernate将加载Order并因异常而失败,因为它应该存在,但不会。
使用not-found=ignore
使Hibernate忽略OrderLine中的order_id,从而将order字段初始化为null。
在设计良好的数据库中,永远不应使用此属性。