在hibernate中使用逆true

时间:2013-12-21 20:02:28

标签: java hibernate

我正在浏览hibernate文档并遇到了反向属性的概念。我是Hibernate的新手,所以我很难理解这个概念。

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

<class name="Category">
    <id name="id" column="CATEGORY_ID"/>
    ...
    <bag name="items" table="CATEGORY_ITEM">
        <key column="CATEGORY_ID"/>
        <many-to-many class="Item" column="ITEM_ID"/>
    </bag>
</class>

<class name="Item">
    <id name="id" column="ITEM_ID"/>
    ...

    <!-- inverse end -->
    <bag name="categories" table="CATEGORY_ITEM" inverse="true">
        <key column="ITEM_ID"/>
        <many-to-many class="Category" column="CATEGORY_ID"/>
    </bag>
</class>

从上面的代码中,inverse="true"应用于类别,因此我理解类别是反面的。

但我看到与我的理解有些矛盾:

  

仅对关联的反向结束所做的更改不是   持续存在。

category.getItems().add(item);   // The category now "knows" about the relationship
item.getCategories().add(category); // The item now "knows" about the relationship

session.persist(item);   // The relationship won't be saved!
session.persist(category);   // The relationship will be saved

如果类别是反向结束,那么如何保存关系?

  

非反面用于保存内存中的表示   数据库。

在查看示例并阅读上述声明后,我发现类别处于非反向结束。

请帮助我了解如何解释此inverse="true"属性。在网上搜索并在SO中查找答案后,我开始知道这个属性的用处,但我仍然有这种困惑。

2 个答案:

答案 0 :(得分:15)

inverse="true"基本上意味着反向关系也映射到另一个类的类定义中。但是,它的真正含义是它定义哪一方是两个实体(父母或子女)的父母或关系所有者。因此,Hibernate映射中的inverse="true"表明该类(具有此XML定义的类)是关系所有者;而另一个班级是孩子。

如果您想了解更多相关内容,那么我肯定会看一下这篇文章:http://www.mkyong.com/hibernate/inverse-true-example-and-explanation/因为在hibernate中很容易误导这个属性的含义。

答案 1 :(得分:2)

创建

反向关键字,以定义维护关系的所有者。更新和插入的过程因此属性而异。

假设我们有两个表:

principal_table middle_table

关系一对多。 hiberntate映射类分别为 Principal Middle

所以 Principal 类有一组对象。 xml映射文件应如下所示:

<hibernate-mapping>
    <class name="path.to.class.Principal" table="principal_table" ...>
    ...
    <set name="middleObjects" table="middle_table" inverse="true" fetch="select">
        <key>
            <column name="PRINCIPAL_ID" not-null="true" />
        </key>
        <one-to-many class="path.to.class.Middel" />
    </set>
    ...

当inverse设置为“true”时,表示“Middle”类是关系所有者,因此Principal类将 NOT UPDATE 关系。

因此,更新程序可以这样实现:

session.beginTransaction();

Principal principal = new Principal();
principal.setSomething("1");
principal.setSomethingElse("2");


Middle middleObject = new Middle();
middleObject.setSomething("1");

middleObject.setPrincipal(principal);
principal.getMiddleObjects().add(middleObject);

session.saveOrUpdate(principal);
session.saveOrUpdate(middleObject); // NOTICE: you will need to save it manually

session.getTransaction().commit();

可以找到更多信息Here这是一个很好的解释如何使用逆属性的教程。它还显示了hinernate如何将其转换为SQL查询。