有很多问题与如何实现由Hibernate管理的实体的良好等于和哈希码函数有关。 但是,我找不到解决问题的方法:
我有一个没有业务键的实体类。它有一个生成的主键,一些不能用于标识的属性和几个与其他实体类的关联。我总是试图坚持Hibernate的建议(商业密钥相等),所以我不想检查生成的Id。 这导致检查2个唯一标识我的实体类的关联。 但这导致必须将这两个关联定义为FetchType.EAGER。
我的等号功能还有其他可供考虑的选择吗?
更新
您如何看待Hibernate中'通用'等于方法的解决方案?
public boolean equals(Object object) {
if (this == object) return true;
if (! (object instanceof AbstractEntity)) return false;
AbstractEntity other = (AbstractEntity) object;
if (getId() == null && other.getId() != null) return false;
if (getId() != null && other.getId() == null) return false;
if (getId() == null && other.getId() == null) return uuid == other.uuid;
return getId().longValue() == other.getId().longValue();
}
通过这个,实体可以安全地用在集合中。分离实体时,将按ID进行比较。当实体是瞬态的时,它将通过生成的UUID进行比较。因此,我看到的唯一缺点是瞬态实体通过UUID而不是业务密钥进行比较。
非常欢迎任何建议!
答案 0 :(得分:0)
Liferay做了类似于以下解决方案的事情。我希望它有所帮助。
此解决方案需要您的表格中的附加列和实体中的一个字段,该字段将包含唯一的“计数器”。这个计数器可以使您的实体与众不同。
会有一个新表,比如“ENTITY_COUNTER”表,它有两列 - 1.你的实体名称和2.最高的“可能”计数器。
您需要创建一个单例,它可以在创建实体时将这些独特的计数器(思考标记)分发给您的实体。每当实体获取令牌时,计数器将递增1。
每次更新最高令牌时,您的单身人士都不会进入数据库。每当它发出1000个独特的令牌时,它就会更新数据库。单身人士将获得一批1000个令牌,并且一旦耗尽这些令牌,它将使用其拥有的最高令牌号更新ENTITY_COUNTER表。
例如ENTITY_COUNTER中的第一个更新将是EntityName 1000,每次创建1000个实体时,该数字将增加1000。
这样,您可以拥有一个唯一的标识符,在您的实体被保留之前可以使用该标识符。