在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_table , middle_table
与一对多的关系。 hiberntate映射类分别是Principal和Middle 。
所以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查询。
- 没有懒惰地初始化一个角色集合
- 为什么Hibernate默认设置动态insert = false
- 是什么导致org.hibernate.PropertyAccessException:setter中发生exception
- Spring + Hibernate会话生命周期
- Hibernate – Custom Dialect的BigDecimal列映射
- 如何在JSF + Spring + Hibernate中使用DTO
- hibernate中的createSQLQuery使用Prepared Statement?
- 使用hibernate JPA注释设置自动生成时间的困难时间
- 使用Spring进行Hibernate二级缓存