Hibernate等于方法

时间:2013-08-15 11:49:28

标签: hibernate orm

有很多问题与如何实现由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而不是业务密钥进行比较。

非常欢迎任何建议!

1 个答案:

答案 0 :(得分:0)

Liferay做了类似于以下解决方案的事情。我希望它有所帮助。

此解决方案需要您的表格中的附加列和实体中的一个字段,该字段将包含唯一的“计数器”。这个计数器可以使您的实体与众不同。

会有一个新表,比如“ENTITY_COUNTER”表,它有两列 - 1.你的实体名称和2.最高的“可能”计数器。

您需要创建一个单例,它可以在创建实体时将这些独特的计数器(思考标记)分发给您的实体。每当实体获取令牌时,计数器将递增1。

每次更新最高令牌时,您的单身人士都不会进入数据库。每当它发出1000个独特的令牌时,它就会更新数据库。单身人士将获得一批1000个令牌,并且一旦耗尽这些令牌,它将使用其拥有的最高令牌号更新ENTITY_COUNTER表。

例如ENTITY_COUNTER中的第一个更新将是EntityName 1000,每次创建1000个实体时,该数字将增加1000。

这样,您可以拥有一个唯一的标识符,在您的实体被保留之前可以使用该标识符。