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

Cha*_*nya 0 java hibernate

根据Hibernate docs for one-to-manyxml mapping标签,有一个名为as的属性not-found

http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/collections.html#collections-onetomany

医生说:

not-found(可选 - 默认为exception):指定如何处理引用缺失行的缓存标识符.ignore会将缺少的行视为空关联.

这个属性有什么用?我试图在Product和Parts之间创建一个映射,Product有一组零件,下面有映射细节:

<set name="parts" cascade="all">
    <key column="productSerialNumber" not-null="true" />
    <one-to-many class="Part" not-found="ignore"/>
</set>
Run Code Online (Sandbox Code Playgroud)

然后我写了我的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();
    }
Run Code Online (Sandbox Code Playgroud)

我期待我的设置为null,其中包含我在映射文件中配置的部件not-found="ignore".但我得到了常规例外 - org.hibernate.LazyInitializationException

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

JB *_*zet 8

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

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

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

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

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