`
qmy
  • 浏览: 4456 次
  • 性别: Icon_minigender_1
  • 来自: 福建三明
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

重写eq/hc方法有必要区分POJO一对一、一对多和多对多的情况吗?

阅读更多
(起个标题很头疼……表达能力相当差)

http://www.iteye.com/post/47540
看了上面的那个帖子后,我觉得有必要区分。

分析了一下,帖子里说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来写,如果用属性值比对反而有可能出问题。


以上只是个人观点,不知道对不对。
分享到:
评论
4 楼 打倒小日本 2007-11-19  
其实这个问题也就是在"新建"并同时设置"关联"的情况下才会发生
一般只要将这两步分开来做,也就没问题了
副作用是会多一条UPDATE语句
但一般系统的瓶颈都是出现在查询
更新操作还是比较少的
3 楼 qmy 2007-11-16  
我想,如果Hibernate官方的意思是推荐无论什么情况都使用业务关键属性来重写eq/hc,那至少我遇到的那种情况也得有一个解决方案。

或者说……难道我这样建表是不对的?用户表和联系方式不应该分开吗?
2 楼 qmy 2007-11-16  
谢谢“打倒小日本”,这样是解决了问题。不过在多对多关系中,这方法就行不通了吧。

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

如果是这样的话,那只要在多对多关系中避免使用id重写eq/hc就可以了,是这样吗?
1 楼 打倒小日本 2007-11-16  
一对多 一般都是多方设置一方
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); 

这样就不会出现上述问题了

相关推荐

    IDEA逆向生成POJO/DAO/MAPPER 《Generate POJOs.groovy》

    dao和mapper 抛弃了mybatis插件生成的一个POJO一个mapper 很冗余的数据,这里直接生成增删改查3个dao/mapper对照,依托于IDEA-DataBase-Tools能够直接选取需要生成POJOS 表模型的选择器。可以很方便的生成pojo/dao/...

    json2pojo功能有点麻烦

    参照https://github.com/joelittlejohn/jsonschema2pojo/wiki/Getting-Started的步骤Using jsonschema2pojo within your Java project (embedded)

    数据表生成pojo

    - 关联关系:如果有外键关联,POJO类可能需要包含对其他POJO类的引用,或者使用集合来表示一对多或多对多的关系。 5. **ORM框架中的POJO应用** - Hibernate:在Hibernate中,POJO作为持久化对象,通过注解或XML...

    java Pojo转Map

    注意,这个方法只处理当前类的字段,如果Pojo类中有嵌套的其他Pojo对象,它们不会被自动展开。若要处理嵌套的Pojo,你需要递归调用`pojoToMap`方法。 现在我们可以创建一个User对象并将其转换为Map: ```java User...

    Mybatis生成pojo插件

    Mybatis是一款广受欢迎的Java持久层框架,它简化了数据库操作与对象模型之间的映射,提供了灵活的SQL映射和基于XML或注解的配置方式。在开发过程中,经常需要手动创建POJO(Plain Old Java Object)类来作为数据表的...

    POJO转Map.txt

    POJO没有特定的框架依赖,它仅仅是一个具有属性及对应的getter和setter方法的普通Java类。POJO在许多场景下都非常有用,比如在网络传输中作为数据载体,在持久化层与业务逻辑层之间作为数据传输对象等。 #### 二、...

    SSM笔记-POJO

    例如,假设有一个用户表,包含id、username和password三个字段,我们可以创建如下的POJO类: ```java public class User { private Long id; private String username; private String password; // getters ...

    webservice1 pojo实现0配置

    - 例如,创建一个名为`SimpleService`的类,包含`getGreeting`和`getPrice`两个公共方法,编译后将`.class`文件放入特定的目录(如`安装目录>webapps/axis2/WEB-INF/pojo`)。 - 无需额外的配置文件,Axis2会自动...

    pojo类与javaBean

    一个典型的POJO类通常只包含属性以及相应的getter和setter方法,但并不限制其实现业务逻辑或其他功能。 **JavaBean**,是一种遵循特定规范的Java类,最初由Sun Microsystems(现在是Oracle的一部分)提出,旨在用于...

    POJO In action 代码

    《POJO In Action》是一本深入探讨Plain Old Java Object(POJO)概念和技术的书籍,其核心在于如何在Java开发中有效地使用简单、无框架依赖的对象。POJOs是Java编程中最基本的元素,它们代表了纯粹的面向对象设计,...

    SSM项目实战pojo类

    2. **访问器和修改器**:每个属性都有对应的getter和setter方法,以便于其他层(如Service和Controller)读取和修改这些属性的值。 3. **序列化**:为了使POJO类能够在网络间传输,或者持久化到文件或内存中,它们...

    POJO javaBean EJB JNDI 理解及区别

    POJO的主要特征是拥有私有属性和对应的getter/setter方法,用于封装数据,类似于数据传输对象(DTO)或值对象。POJO不包含业务逻辑或持久化逻辑,其主要作用是在不同的层级之间传递数据。在使用Hibernate框架时,...

    一个利用反射,把一个pojo付个另一个pojo的例子

    根据属性名相同, 把一个pojo的属性值付给另一个pojo相同属性名.

    实体类POJO生成器

    对于复杂的数据库设计,如包含外键关联的表,生成器可能还会生成对应的关联对象,比如一对多、多对一、多对多关系。在处理这类关系时,生成器会生成对应的List、Set或单个对象引用,以满足Java对象模型的构建。 在...

    关于pojo类注解

    5. **@OneToMany**,**@ManyToOne**,**@OneToOne**和**@ManyToMany**注解:这些注解用于处理实体之间的关联关系,如一对一、一对多、多对一和多对多关系。例如,用户和角色的关系可能是多对多: ```java @Entity...

    Struts2 Pojo(六)

    默认情况下,如果Action返回一个字符串,Struts2会寻找匹配该字符串的结果类型配置,比如“success”可以对应到一个JSP页面。这种设计使得Action的返回值更语义化,降低了代码的耦合度。 4. **拦截器(Interceptors...

    用WebService传递POJO和对象数组的例子.doc

    POJO是指没有特定框架约束的普通Java对象,它提供了一种简单的方法来封装数据和行为。在Web服务上下文中,POJO可以被直接映射为服务的输入和输出参数,使得服务接口更直观、更易于理解。 在AXIS2中,我们可以直接将...

    pojo和xml自动生成工具

    写好配置后,连接数据库,读取所有表,自动生成pojo和mybatis xml增删改查字段信息。剩下的工作就是复制-粘贴-修改。生成的pojo里面只有成员变量没有set/get方法,因为生成代码麻烦但是在eclipse里面添加这个很简单...

    VO / DTO / BO / ORM DAO entity DO PO/ POJO(分层领域模型规约)整理

    - **定义**:BO 表示业务对象,封装了一组业务逻辑或操作,通常包含业务规则和方法。 - **应用场景**: - 复杂业务流程的管理。 - 将多个PO或DO组合在一起形成一个更高级别的业务单元。 - **优势**: - 支持复杂...

    hibernate自动生成Pojo

    - 对于多对一或一对多关系,可能使用 `@ManyToOne` 或 `@OneToMany` 等注解。 - 对于一对一关系,可能使用 `@OneToOne` 注解。 - 对于外键关联,可能使用 `@JoinColumn` 注解。 理解并掌握 Hibernate 反向工程的...

Global site tag (gtag.js) - Google Analytics