知识大全 hibernate 中inverse
Posted 知
篇首语:早知今日读书是,悔作从前任侠非。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 hibernate 中inverse相关的知识,希望对你有一定的参考价值。
Inverse是hibernate双向关系中的基本概念 inverse的真正作用就是指定由哪一方来维护之间的关联关系 当一方中指定了 inverse=false (默认) 那么那一方就有责任负责之间的关联关系 说白了就是hibernate如何生成Sql来维护关联的记录
Hibernate仅仅按照主控方对象的状态的变化来同步更新数据库 按照原来的映射文 件 people getAddresses() add(address) 即主控方对象的状态发生了改变 因此数据库会跟着对象状态的变化来同步更新 数据库 而address setPeople(people) 即被控方对象的状态发生了改变 它是不能触发对象和数据库的同步更新的
(实例 )
举个最简单的一对多父子关系 那么代码就写成
父亲中的关系映射
set name= children lazy= true inverse= true
key column= parent_id /
one to many class= test Child /
/set
儿子中关系映射
many to one name= parent column= parent_id not null= true /
Parent p = new Parent()
Child c = new Child()
c setParent(p) //维护父子之间关系
p getChildren() add(c)
session save(p)
session flush()
注意 many to one总是设成 inverse=false 的 而且这个属性在Mapping中是不存在的!
这样运行的下来的结果就是
Hibernate: insert into parent (id) values (?)
Hibernate: insert into child (parent_id id) values (? ?)
那么假如c setParent(p)注释掉 结果就是
Hibernate: insert into parent (id) values (?)
===================================================
(实例 )
一个Person可以参加多个Event 一个Event有多个Person参加
映射文件如下
<! Person hbm xml >
<hibernate mapping package= events >
<class name= Person table= person >
<id name= id column= person_id >
<generator class= native />
</id>
<property name= age length= />
<property name= firstname />
<property name= lastname />
<set name= events table= person_event >
<key column= person_id />
<many to many column= event_id class= events Event />
</set>
</class>
</hibernate mapping>
<! Event hbm xml >
<hibernate mapping>
<class name= events Event table= events >
<id name= id column= event_id >
<generator class= native />
</id>
<property name= date column= events_date type= timestamp />
<property name= title column= events_title />
<set name= participants table= person_event inverse= true >
<key column= event_id />
<many to many column= person_id class= events Person />
</set>
</class>
</hibernate mapping>
inverse=true的含义 由双向关联另一方维护该关联 己方不维护该关联(只能进行查询操作) 在上述代码中 由Person方维护该<many to many>关系 示例代码如下(以向Person参与的Event中加入新的Event为例)
Session session = HibernateUtil getSessionFactory() getCurrentSession()
session beginTransaction()
Person p = (Person) session load(Person class personId)
Event e = (Event) session load(Event class eventId)
p getEvents() add(e) //执行该代码时 hibernate会向中间表 person_event中插入person_id和event_id记录 如果换成e getParticipants() add(p)的话 该代码将不会被执行 即hibernate不会向表person_event中插入记录
session getTransaction() mit()
要注意的一点 在双向关联的关系中 映射的column(和table)的值要一致(即要用相同的表名和列名) 不然设置为inverse= true 的这方将失去这个双向关系 而变成了一个单向关联
二 Inverse和Cascade的比较
Inverse:负责控制关系 默认为false 也就是关系的两端都能控制 但这样会造成一些问题 更新的时候会因为两端都控制关系 于是重复更新 一般来说有一端要设为true
Cascade:负责控制关联对象的级联操作 包括更新 删除等 也就是说对一个对象进行更新 删除时 其它对象也受影响 比如我删除一个对象 那么跟它是多对一关系的对象也全部被删除
cha138/Article/program/Java/ky/201311/28235相关参考
Hibernate性能调优 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! inverse=?
Hibernate性能调优[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! inverse=
知识大全 控制反转(Inversion of Control)介绍
控制反转(InversionofControl)介绍 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Hibernate中重要对象[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! →→Sessi
Hibernate中重要对象[4] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! ◆Sessin
Hibernate中重要对象[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! ()Sessi
Hibernate中cascade作用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 只有关系标
Hibernate中重要对象[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 使用方法链编程
Hibernate中Criteria的用法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 最近在
知识大全 在Hibernate中Oraclesequence的使用
在Hibernate中Oraclesequence的使用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下