使用hibernate的一对多映射的not-found属性

时间:2013-12-21 15:22:40

标签: java hibernate

根据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

请帮助我了解这个属性的用途是什么?什么是缓存标识符?

1 个答案:

答案 0 :(得分:7)

未找到与延迟加载无关。它用于处理数据库中的不一致性。

假设您对良好的数据库实践一无所知,并且有一个包含order_line列的order_id表,该列应该引用它所属的order。并且假设由于您对良好实践一无所知,因此您对此列没有外键约束。

因此,即使订单具有引用它的订单行,也可以删除订单。当使用Hibernate加载这样的OrderLine时,Hibernate将加载Order并因异常而失败,因为它应该存在,但不会。

使用not-found=ignore使Hibernate忽略OrderLine中的order_id,从而将order字段初始化为null。

在设计良好的数据库中,永远不应使用此属性。