在hibernate中使用逆true

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

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

  ...        ...       

从上面的代码中, 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中查找答案后,我开始知道这个属性的用处,但我仍然有这种困惑。

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

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

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

假设我们有两个表:

principal_tablemiddle_table

一对多的关系。 hiberntate映射类分别是PrincipalMiddle

所以Principal类有一个SET 中间对象。 xml映射文件应如下所示:

   ...       ... 

由于inverse设置为“true”,这意味着“Middle”类是关系所有者,因此Principal类不会更新关系。

所以更新程序可以像这样实现:

 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(); 

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