- 浏览: 562917 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (411)
- webservice (3)
- oracle (37)
- sqlserver (8)
- j2ee (56)
- linux (7)
- javaweb (47)
- office (1)
- struts (23)
- hibernate (11)
- spring (29)
- 网络 (2)
- tomcat (13)
- tongweb (0)
- weblogic (0)
- powerdesiginer (3)
- svn (3)
- js (20)
- ie (2)
- 编译 (3)
- css (2)
- 操作系统 (5)
- Android (41)
- jbpm4.3 (1)
- fckeditor (3)
- 操作excel (2)
- db2常用命令 (1)
- ibatis (5)
- mysql (16)
- 表达式语言 (1)
- java方式调用存储过程 (1)
- ca (1)
- linux客户端 (1)
- 电子数码 (1)
- 行业应用 (12)
- 开发工具 (4)
- 面试 (1)
- 计算机原理 (1)
- NOSQL (5)
- 虚拟机 (1)
- nginx (0)
- velocity (2)
- jndi (1)
- spring mvc (39)
- springmvc (32)
- 安全 (5)
- htmleditor (6)
- iphone4 (1)
- html (4)
- jstl (2)
- ckeditor (5)
- 连接池 (1)
- jquery (6)
- 分页 (1)
- 技术研发规则 (1)
- javamail (1)
- maven (2)
- upload (1)
- log (1)
- 测试 (10)
- spring roo (1)
- 版本控制 (2)
- find bugs (0)
- jsf (0)
- springroo (0)
- 小道理 (1)
- 小道理,技术标准 (1)
- jsf (0)
- bitbao (2)
- redmine (3)
- 团队意识 (1)
- mybatis (2)
- jquery mobile (1)
- flexpaper (0)
- json (4)
- URLRewriteFilte (1)
- html5 (1)
- 都乐保活动 (0)
- openfire (0)
- TreeMap (1)
- build (0)
- javaweb,tag (0)
- algorithm (1)
- tag (2)
- 扯淡 (0)
- mac (2)
- 叶一火(老一) (1)
- 游玩 (1)
- 编码 (1)
- 上线部署 (0)
- 研发管理 (0)
- thumbnailator (2)
- 旅游 (0)
- bingweibo (1)
- 杂谈 (4)
- ktv (1)
- weibo (1)
- 爱情 (2)
- 饮食 (1)
- MediaWiki (1)
- git (1)
- 版本库 (1)
- servlet (1)
- 感悟 (1)
- 人生 (1)
- highcharts (1)
- poi (0)
- websphere (0)
- php (1)
最新评论
-
woshixushigang:
good
org.springframework.beans.TypeMismatchException: Failed to convert property valu -
nathanleewei:
org.springframework.jdbc.core.B ...
org.springframework.beans.TypeMismatchException: Failed to convert property valu -
浪禾木:
请问是ckeditor\contents.css吗?改过以后 ...
ckeditor自动换行问题 -
simusuishi:
刚哥威武!
ckeditor取值赋值问题 -
a455642158:
收割完毕……
Android开源项目源码下载(不断更新中)
对hibernate关系的维护比较头疼,遂总结下做个备份。
什么时候维护关系:当关联双方对象有一方的属性发生变化时。
举例:一个用户有多个账户,类User和类Account是一对多的双向关联关系。
User类:
public class User {
private Long oid;
private String uid;
private String name;
//关联属性
private Set accts = new HashSet();
......
}
Account类:
public class Account {
private Long oid;
private String acctNo;
private double bal;
//关联属性
private User owner;
......
}
表mq_user:
mysql> desc mq_user;
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| OID | bigint(20) | NO | PRI | NULL | auto_increment |
| USER_ID | varchar(255) | NO | UNI | NULL | |
| USER_NAME | varchar(255) | NO | | NULL | |
+-----------+--------------+------+-----+---------+----------------+
表mq_acct2:
mysql> desc mq_acct2;
+--------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+----------------+
| OID | bigint(20) | NO | PRI | NULL | auto_increment |
| ACCTNO | varchar(255) | NO | UNI | NULL | |
| BAL | double | NO | | NULL | |
| FID | bigint(20) | YES | MUL | NULL | |
+--------+--------------+------+-----+---------+----------------+
映射文件:
User.hbm.xml:
<set name = "accts" inverse = "false" >
<key column="FID" />
<one-to-many class="Account" />
</set>
Account.hbm.xml:
<many-to-one name = "owner"
class = "User"
column = "FID"/>
如果:Session s = HbnUtil.getSession();
s.beginTransaction();
Account acct1 = new Account("a01", 5000.0);
User user = new User("u01","jack");
user.getAccts().add(acct1);
s.save(user);
s.save(acct1);
s.getTransaction().commit();
结果:Hibernate:
insert
into
mq_user
(USER_ID, USER_NAME)
values
(?, ?)
Hibernate:
insert
into
mq_acct2
(ACCTNO, BAL, FID)
values
(?, ?, ?)
Hibernate:
update
mq_acct2
set
FID=?
where
OID=?
说明:一对多双向关联中默认多的一方inverse=”false”,也就是说由多的一方维护关系。
这里把一的一方的inverse也改为false,并且在代码中不写acct1.setOwner(user)是为了测试一的一方是如何维护关系的。
在执行了insert into 语句以后,紧接着执行的update语句就是一的一方在维护关系。
从执行的过程还可以看出,维护关系的动作实际上是update而不是insert操作。
总结:1,多的一方总是维护且必须维护关系(many-to-one中没有inverse属性),一的一方可以选择维护或不维护。
---------------------------------------------------------------------
如果:Session s = HbnUtil.getSession();
s.beginTransaction();
Account acct1 = new Account("a01", 5000.0);
User user = new User("u01","jack");
user.getAccts().add(acct1);
s.save(user);
s.getTransaction().commit();
结果:Hibernate:
insert
into
mq_user
(USER_ID, USER_NAME)
values
(?, ?)
Hibernate:
update
mq_user
set
USER_ID=?,
USER_NAME=?
where
OID=?
Hibernate:
update
mq_acct2
set
FID=?
where
OID=?
org.hibernate.TransientObjectException:
说明:去掉了对acct1的保存。抛异常。
inverse是关系维护而不是级联操作(通过配置cascade属性可以让user被保存时级联acct1一起被保存),关系维护只会update。
总结:2,关系维护只做update,不搞级联,所以要注意维护的数据是否已经在数据库中。
除非做了级联create或者数据库中有被维护的数据,否则是要抛异常滴。
---------------------------------------------------------------------
如果:Account acct1 = new Account("a01", 5000.0);
User user = new User("u01","jack");
user.getAccts().add(acct1);
s.save(user);
s.save(acct1);
user.setName("aaaaa");
结果:Hibernate:
insert
into
mq_user
(USER_ID, USER_NAME)
values
(?, ?)
Hibernate:
insert
into
mq_acct2
(ACCTNO, BAL, FID)
values
(?, ?, ?)
Hibernate:
update
mq_user
set
USER_ID=?,
USER_NAME=?
where
OID=?
Hibernate:
update
mq_acct2
set
FID=?
where
OID=?
说明:因为user是一个持久化对象(被session保存过),所以在user属性发生改变时,session会监测user属性是否改变并在改变后自动执行update mq_user。但不管acct1属性是否改变,也不管user的name改变是否影响到了他和acct1的关系,都会再维护一次。
---------------------------------------------------------------------
如果:Account acct1 = new Account("a01", 5000.0);
User user = new User("u01","jack");
user.getAccts().add(acct1);
s.save(user);
s.save(acct1);
acct1.setBal(999);
结果:
Hibernate:
insert
into
mq_user
(USER_ID, USER_NAME)
values
(?, ?)
Hibernate:
insert
into
mq_acct2
(ACCTNO, BAL, FID)
values
(?, ?, ?)
Hibernate:
update
mq_acct2
set
ACCTNO=?,
BAL=?,
FID=?
where
OID=?
Hibernate:
update
mq_acct2
set
FID=?
where
OID=?
说明:因为acct1是持久化对象,所以session在发现acct1的bal发生改变后会自动执行
update mq_acct2语句。随后负责维护关系的user一方会再维护一次关系。
------------------------------------------------------------------------------------
<!--[endif]-->
如果:Account acct1 = new Account("a01", 5000.0);
User user = new User("u01","jack");
user.getAccts().add(acct1);
acct1.setOwner(user);
s.save(user);
s.save(acct1);
acct1.setBal(999);
结果:Hibernate:
insert
into
mq_user
(USER_ID, USER_NAME)
values
(?, ?)
Hibernate:
insert
into
mq_acct2
(ACCTNO, BAL, FID)
values
(?, ?, ?)
Hibernate:
update
mq_acct2
set
ACCTNO=?,
BAL=?,
FID=?
where
OID=?
Hibernate:
update
mq_acct2
set
FID=?
where
OID=?
说明:如果双方是双向关联又各自都维护关系,那么当需要维护时会各自维护一次。
总结:3,实际运行时的对象如果不知道对方对象的存在(没有关联)就不会维护关系。
4,只要任意一方属性变了就维护,不管这个变更是否影响到了关系。
发表评论
-
spring mvc 乐观锁遇到的问题
2013-05-29 17:29 1955乐观锁问题:updateTime @version ... -
hibernate命名查询问题
2013-01-30 16:38 1281hibernate 注解 @OneToOne(fetc ... -
hibernate [Null value was assigned to a property of primitive type setter of sco
2012-12-25 19:51 1078今天开发时候 hibernate 查询报错,分析原因如下: ... -
hibernate4注解配置,纠结的一对多双向关联
2012-12-20 11:16 1731目前负责中行风险管理系统的数据核对加工模块,业务以及逻辑都已经 ... -
hibernate4 注解配置失误导致生成的表关联关系不对
2012-12-18 19:52 1196最近做ibm 风险管理系统,配置hibernate 注解时候看 ... -
eclipse codestyle和formate
2011-12-26 11:20 1026北京都乐宝软件信息技术公司的代码风格 -
Common-logging 与 Log4j的结合使用
2011-12-25 15:58 1166转自:http://hi.baidu.com/suofang/ ... -
ssh整合(转)
2011-09-06 14:50 1244终于,终于将SSH整合成 ... -
hibernate 一对多one-to-many 单向 and 双向(many-to-one),inverse(反转)
2011-06-16 09:17 2184hibernate 一对多 单向 classes----&g ... -
mappedBy
2011-06-15 14:42 1695对于mappedBy的理解: a) 只有OneToOne, ...
相关推荐
和其它许多批注一样,在多对多关联中很多值是自动生成,党双向多对多关联中没有定义任何物理映射时,Hibernate根据以下规则生成相应的值,关联表名:主表表名+下划线+从表表名,关联到主表的外键名:主表名+下划线+...
7.1 建立多对一的单向关联关系 7.1.1 元素的not-null属性 7.1.2 级联保存和更新 7.2 映射一对多双向关联关系 7.2.1 元素的inverse属性 7.2.2 级联删除 7.2.3 父子关系 7.3 映射一对多双向自身关联...
这种策略支持双向的一对多关联,但不支持 IDENTIFY 生成器策略,因为ID必须在多个表间共享。一旦使用就不能使用AUTO和IDENTIFY生成器。 每个类层次结构一张表 @Entity @Inheritance(strategy=InheritanceType....
7.1 建立多对一的单向关联关系 7.1.1 元素的not-null属性 7.1.2 级联保存和更新 7.2 映射一对多双向关联关系 7.2.1 元素的inverse属性 7.2.2 级联删除 7.2.3 父子关系 7.3 映射一对多双向自身关联...
7.1 建立多对一的单向关联关系 7.1.1 元素的not-null属性 7.1.2 级联保存和更新 7.2 映射一对多双向关联关系 7.2.1 元素的inverse属性 7.2.2 级联删除 7.2.3 父子关系 7.3 映射一对多双向自身关联...
7.1 建立多对一的单向关联关系 7.1.1 元素的not-null属性 7.1.2 级联保存和更新 7.2 映射一对多双向关联关系 7.2.1 元素的inverse属性 7.2.2 级联删除 7.2.3 父子关系 7.3 映射一对多双向自身关联...
Hibernate映射多对多(两个一对多实现多对多) 表:材料表和产品表多对多,在数据库中有中间表即产品材料表用来存放两个表之间的关系 Java类:材料PO,产品PO,中间PO,中间PO的复合主键类(由于是两个一对多形成的多对...
一般在做双向多对一(一对多)关联关系映射的时候,一般会设置让一的一方放弃对关联关系的维护,以减少不必要的更新语句 一对一: 基于外键的一对一 Wife Husband id id name name h_id references Husband...
@OneToMany(mappedBy 相当于 inverse ) @ManyToOne 结合 @JoinColumn 添加一列外键 @ManyToMany 一方写 mappedBy 放弃外键维护、另一方 @JoinTable 维护中间表 收派标准修添加能实现 html 请求 后台...