JiveJdon Community Forums
在线166人 Home | 论坛 | 培训咨询 | 精华 | 查搜 | 注册 | 登陆 |
首页 » 论坛 » 开源项目大家谈
???en_US.forumThreadPrev.name??? 上一主题
Go back to the topic listing   返回主题列表
???en_US.forumThreadNext.name??? 下一主题
这个主题共有 1 回复 / 1 页 [ ]  发表新帖子  回复该主题贴
qq7338367

发表文章: 5
注册时间: 2007年11月25日 03:31
给他发消息
[Hibernate]重写eq/hc方法有必要区分POJO一对一、一对多和多对多的情况吗? 发表: 2007年11月25日 04:10 回复
分析了一下,ID作为主键会出问题主要是在用到Set的情况下(也就是一对多或者多对多),比如说某用户保存了两个新建的email。


......
User user = session.load(User.class,new Integer(1));
Email e1 = new Email();
Email e2 = new Email();
e1.setAddress("xxx@xx.com");
e2.setAddress(
"yyy@yy.com");
user.getEmails().add(e1);
//这时候id为null,即使equals方法里逻辑是“id为空则返回false”
user.getEmails().add(e2);
//hashcode值又该如何计算?所以这时候eq/hc方法要用业务关键属性来写
session.save(user);
.....


但业务键值比对的方法有时候好像又不适用
举个例子吧:
一对一的情况。现在有两个表,用户表和用户联系方式表,用户表作为主表,联系方式表的主键作为外键与用户表关联。联系方式表除了主键其余字段都可为空,这时候如果用“值比对”的方式写eq/hc,很有可能逻辑上应该不相等的两个对象equals的结果是true(比如说两个不同对象的所有属性值都为空),得到的hashcode也是一样的。这时候为了避免这个问题,eq/hc方法可以用id来写。因为是一对一的关系,用不到Set,所以也不会产生上面提到的问题。

总结了一下,就是:
1、不改写eq/hc,在跨session操作时会出现问题;
2、一对多或者多对多关系中,pojo的eq/hc不能用id来写,而应该用业务关键属性来写;
3、一对一关系中,pojo的eq/hc可以用id来写,如果用属性值比对反而有可能出问题。

以上只是个人观点,不知道对不对。

有朋友和我说:
==========================
一对多 一般都是多方设置一方



Email e1 = new Email();
Email e2 = new Email();
e1.setAddress(
"xxx@xx.com");
e2.setAddress(
"yyy@yy.com");
e1.setUser(user);
e2.setUser(user);
session.save(e1);
session.save(e2);


这样就不会出现上述问题了
===========================
这样是解决了问题。不过在多对多关系中,这方法就行不通了吧。

我搞不明白的是:Hibernate官方不推荐用id来重写eq/hc,究竟是因为什么呢?仅仅因为对象在自由状态的时候id为null而不推荐使用来重写吗?

如果是这样的话,那只要在多对多关系中避免使用id重写eq/hc就可以了,是这样吗?
banq

发表文章: 9074
注册时间: 2002年08月03日 17:08
给他发消息
回复:[Hibernate]重写eq/hc方法有必要区分POJO一对一、一对多和多对多的情况吗? 发表: 2007年11月26日 09:44 回复
第一种方式需要激活cacade="all",且主键由Hibernate产生,使用merget等方法、

第二种方式则是通常使用方式。


关于你说的那些烦琐POJO重写eq/hc方法,都是画蛇添足,将问题复杂化,违反对象基本原则封装性,而且使用POJO概念不准确,应该是Entity概念,万事万物实体都有一个标识ID,不是外界能够修改的,你是程序员,不是上帝,所以,要用好Hibernate,基础读物就是Evans DDD.
这个主题有 1 回复 / 1 页 [ ]
???en_US.forumThreadPrev.name??? 上一主题
Go back to the topic listing   返回主题列表    返回页首  返回页首
???en_US.forumThreadNext.name??? 下一主题
热点TAG: AOP cache DDD EJB 集群 设计模式 Hibernate IOC JiveJdon OO RBAC Spring Struts
查询本论坛内 回复超过的热门帖子
快速发表回复
标题
 
粗体 斜体 下划线 插入图片 插入代码 插入url链接 插入附件
内容
 

解惑之道在J道 ,打造中国最具影响力的的企业软件社区
OpenSource JIVEJDON v3.0 Powered by JdonFramework Code © 2002-08 jdon.com

anti spam