hibernate多生成一个外键以及映射文件中含有<list-index>标签
(原文地址: http://blog.csdn.net/xiaoxian8023/article/details/15380529)
一、Inverse是hibernate双向关系中的基本概念。inverse的真正作用就是指定由哪一方来维护之间的关联关系。当一方中指定了“inverse=false”(默认),那么那一方就有责任负责之间的关联关系,说白了就是hibernate如何生成Sql来维护关联的记录!
Hibernate仅仅按照主控方对象的状态的变化来同步更新数据库。按照原来的映射文件,people.getAddresses().add(address),即主控方对象的状态发生了改变,因此数据库会跟着对象状态的变化来同步更新数据库;而address.setPeople(people),即被控方对象的状态发生了改变,它是不能触发对象和数据库的同步更新的。
(实例1):
举个最简单的一对多父子关系。那么代码就写成:
- Parent p = new Parent();
- Child c = new Child();
- c.setParent(p); //维护父子之间关系
- p.getChildren().add(c);
- session.save(p);
- session.flush();
映射文件配置:
- 父亲中的关系映射
- {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"/}
set中inverse="true",说明父子关系只在多的一端(Child)维护。所以只会发出2个insert语句。
注意:{many-to-one}总是设成“inverse=false”的,而且这个属性在Mapping中是不存在的!
这样运行的下来的结果就是:
- Hibernate: insert into parent (id) values (?)
- Hibernate: insert into child (parent_id, id) values (?, ?)
如果将set中的inverse设为true,那么会发出3条sql语句,前2条是insert语句,后1条是update语句用来维护parent和child类的父子关系。
当然,假如c.setParent(p)注释掉(破坏了父子关系),结果就变成了:
- Hibernate: insert into parent (id) values (?)
===================================================
(实例2):
一个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="0"/>
- <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().commit();
要注意的一点:在双向关联的关系中,映射的column(和table)的值要一致(即要用相同的表名和列名),不然设置为inverse="true"的这方将失去这个双向关系,而变成了一个单向关联。
二、Inverse和Cascade的比较
Inverse:负责控制关系,默认为false,也就是关系的两端都能控制,但这样会造成一些问题,更新的时候会因为两端都控制关系,于是重复更新。一般来说有一端要设为true。
Cascade:负责控制关联对象的级联操作,包括更新、删除等,也就是说对一个对象进行更新、删除时,其它对象也受影响,比如我删除一个对象,那么跟它是多对一关系的对象也全部被删除。
举例说明区别:删除“一”那一端一个对象O的时候,如果“多”的那一端的Inverse设为true,则把“多”的那一端所有与O相关联的对象外键清空;如果“多”的那一端的Cascade设为Delete,则把“多”的那一端所有与O相关联的对象全部删除。
对hibernate List一对多中list-index的理解(原文地址: http://blog.csdn.net/u014437455/article/details/22516865)
对于hibernate中List集合一对多;一直存在迷惑;每次用的时候总是要查阅许多资料;索性自己就总结啦一下;
eg:
品牌表:
<many-to-one name="subType" class="com.oracle.webdp.entity.SubType" fetch="join">
<column name="SUBTYPE_ID"/>
</many-to-one>
小类表:
<list name="brands" inverse="false" table="BRAND" lazy="true">
<key>
<column name="SUBTYPE_ID" />
</key>
<list-index>
<column name="`index`"></column>
</list-index>
<one-to-many class="com.oracle.webdp.entity.Brand" />
</list>
(1):关于key的配置
以前总是对于key里面的column中name属性感到迷惑;首先要明白这个字段是位于品牌表(多的一方);是他的一个属性(字段);名字可以随便取;只要保证两边设置的值是一样的;即可;可以查看生成对应的表信息
这样的话就明白了key的真正用途;
(2):关于list-index的配置-----------在保存行数据进表里时,hiberante会帮你维护顺序
相信大家对于set集合的配置已经很熟悉啦;它有两个特点:不能重复且是无序的;相反list集合却是有序且允许重复的;
这么就引出一个问题;数据库如何保证数据的有序性哪?
思路:设置一个索引字段;用以保存顺序;
hibernate多生成一个外键以及映射文件中含有<list-index>标签的更多相关文章
- 映射文件中增删改查标签中的parameterType和resultType
parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中. resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射 ...
- Hibernate 注解多对一 要求在多那边产生一个外键而不会另外产生一个表
在使用hibernate注解的时候,我们映射一对多时,有时候莫名其妙的产生了两张表,其中一张表是A_B,这并不符合数据库中多的一方放置一个外键的原则,那么如何控制只产生一个表呢,请看下面的例子: 多的 ...
- 011一对一 唯一外键关联映射_单向(one-to-one)
² 两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ² 有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库 ...
- Entity Framework Code First主外键关系映射约定
本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...
- 012一对一 唯一外键关联映射_双向(one-to-one)
² 两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ² 有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库 ...
- Linq技巧4——怎么在.NET 3.5 SP1中伪造一个外键属性
在.NET 4.0 的EF 中,增加了FK Associations 的功能,但是在.NET 3.5 SP1 中,仅仅支持独立的关联,这意味着FK 栏位不能作为实体的属性来使用,也就是说在使用的时候, ...
- 试图删除 xx 和yy之间的关系。但是,关系的其中一个外键 (xx_yy.xxID) 无法设置为 null。
错误原因:试图删除 UserInfoGroup 和 UserInfoGroupLinkLimitsOfAuthority 之间的关系.但是,关系的其中一个外键 (UserInfoGroupLinkLi ...
- hibernate多对一单向外键
hibernate多对一单向外键: 描述:
- myeclipse自动生成可持久化类的映射文件的方法
1.打开DB Browser,新建一个数据库的连接,找到想要持久化操作的数据库表的图标,右键选择hibernate reverse engineering 2.之后出现如下所示: java src f ...
随机推荐
- Android Studio中绘制simpleUML类图详细说明及使用
一.Android Studio中安装simpleUML 1.下载simpleUML jar包 地址为:http://plugins.jetbrains.com/ 搜索 simpleUMLCE 2. ...
- 深度优先搜索DFS(一)
实例一 0/1背包问题: 有n件物品,每件物品的重量为w[i],价值为c[i].现在需要选出若干件物品放入一个容量为V的背包中,使得在选入背包的物品重量和不超过容量V的前提下,让背包中的物品 ...
- ES timeout 的一些笔记
首先解释下Timeout的作用: 比如,一个search,可能要10分钟才能搜完,那么,es就会等10分钟,直到结果出来.然而,在某些场景下,客户是等不了10分钟的.比如,淘宝搜东西的时候,客户宁可等 ...
- Linux内存解读
1.free -m命令 [root@crawler ~]# free -m total used free shared buffers cached Mem: -/+ buffers/cache: ...
- dotnet core调试docker下生成的dump文件
最近公司预生产环境.net core应用的docker容器经常出现内存暴涨现象,有时会突然吃掉几个G,触发监控预警,造成容器重启. 分析了各种可能原因,修复了可能发生的内存泄露,经测试本地正常,但是发 ...
- 多对多manytomany
----------------------多对多manytomany 要点: 多对多必须有mappedBy,让一个端维护关系 多对多会创建一张关系表,维护关系就是维护第三张表. 所以增加关系,则在集 ...
- new words
Your cooperation is greatly appreciated 感谢您的合作! budget 预算
- Nginx+Memcache+一致性hash算法 实现页面分布式缓存(转)
网站响应速度优化包括集群架构中很多方面的瓶颈因素,这里所说的将页面静态化.实现分布式高速缓存就是其中的一个很好的解决方案... 1)先来看看Nginx负载均衡 Nginx负载均衡依赖自带的 ngx_h ...
- rest_framework目录
一 REST API规范 二 rest framework框架的基本使用
- gentoo annie youku video
在gentoo 上面,如果需要下载 youku 的视频的话,可以使用 annie 这个软件来下载.annie 软件主页:https://github.com/iawia002/annie#instal ...