我正在浏览hibernate文档并遇到了反向属性的概念。我是Hibernate的新手,所以我很难理解这个概念。
<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中查找答案后,我开始知道这个属性的用处,但我仍然有这种困惑。
答案 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查询。