iteye_2757 2008-11-04 22:52
浏览 443
已采纳

hashcode 和 equals 中能否使用 version 属性


使用乐观锁,在数据库中使用了一个 version 列,对应 Hibernate POJO有一个 version 属性。

在实现 HashCode, equals 方法时是不是不能包括 version 属性呢?



对于如下 POJO 类

public class User {

   private Integer id;

   private String name;

   private String fist_name;

   private String last_name;

   private String password;

   private String password_hint;

   private String email;

   private String address;

   private String city;

   private String post_code;

....

   private Integer version;

...



}

主键是 Id, 关键属性是 name, email ,其它可以为 null。



在 HashCode,equals  中是包含 id,name,email ,还是包含除了 version 之外的所有列?
问题补充:
如果这样的类,该如何确定业务键属性:

public class Road{

   private Integer Id;

   private Set<location> locations = new HashSet<location>();

   private Type type;



  get/set

...

}
问题补充:
Road 类的含议是:

每条道路含有N个地点:locations

每条道路有一种类型,比如国家一级路,省级路等:type



在这种情况下,用locations,type可以确定一条线路。但是《深入浅出 Hibernate》上讲不能使用集合作为业务关键字,否则会引起很多问题。



而 Hibernate 又不能以 id 为业务关键字。那么就只能以Type为关键字,这样的话,根本不能生成有效的 HashCode()和equals()



怎么办?


问题补充:
to mccxj :

很有道理,谢谢。



现在,我想将 roadLocation 加入 Set 集合



public class RoadLocation  implements java.io.Serializable {

private Integer id;

private Road road; //道路对象

private Location location; //地点对象

private Integer mileage; //里程

..

在 HashCode, equals中是否可以

@Override

public boolean equals(Object obj) {

if (this == obj)

return true;

if (getClass() != obj.getClass())

return false;

RoadLocation other = (RoadLocation) obj;

if (location == null) {

if (other.location != null)

return false;

} else if (!location.equals(other.location))

return false;

if (mileage == null) {

if (other.mileage != null)

return false;

} else if (!mileage.equals(other.mileage))

return false;

if (road == null) {

if (other.road != null)

return false;

} else if (!road.equals(other.road))

return false;

return true;

}



@Override

public int hashCode() {

final int prime = 31;

int result = prime

+ ((location == null) ? 0 : location.hashCode());

result = prime * result + ((mileage == null) ? 0 : mileage.hashCode());

result = prime * result + ((road == null) ? 0 : road.hashCode());

return result;

}



这里是使用 road,location 比较,还是使用 road.getName location.getName 比较好呢?


问题补充:
不知我是不是太笨了,竟找不到javaeye回贴的submit,只能不停地用“问题补充”。



to mccxj :

你认为

location.equals(other.location)

road.equals(other.road)

这样的比较正确吗?还是



location.getName().equals(other.location.getName())

road.getName().equals(other.road.getName())



更好呢?

  • 写回答

8条回答 默认 最新

  • 「已注销」 2008-11-08 19:17
    关注

    呵呵,下午睡觉和打球去了。。

    location.getName().equals(other.location.getName())
    road.getName().equals(other.road.getName())

    这样的写法,岂不是把location和road的业务都给包含进去了嘛?
    这些本来就属于他们的义务,不应该越俎代庖。。。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

悬赏问题

  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)