gpt4 book ai didi

hibernate - 在 JPA2/Hibernate 中使用覆盖的 equals/hashCode 审计 @Embeddables 的集合

转载 作者:行者123 更新时间:2023-12-04 08:44:43 25 4
gpt4 key购买 nike

我有一个 JPA2/Hibernate 设置。此外,实体由 Hibernate Envers 审计。我有以下类来表示只有一个字段的邮政编码,即 value .

当仅将任何邮政编码的一个实例保存到 Set<PostalCode> 时,一切正常。 .但是,当我尝试添加另一个邮政编码时,审核失败并出现以下异常:

Caused by: javax.persistence.EntityExistsException: a different object with the same identifier value was already associated with the session: [PostalCodesAudit#{PostOffice_id=5, revision_id=DefaultRevisionEntity(id = 16, revisionDate = Aug 19, 2013 8:50:05 AM), revisionType=ADD}]
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1359)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1310)
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:80)
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:513)
... 58 more

奇怪的是,当我删除 equals 的实现时,它运行良好。和 hashCode来自 PostalCode类,该机制工作正常。另外,如果我将集合更改为 Set<String> ,类似的映射工作完美。

我不是绝对需要实现 equalshashCodePostalCode类,但我也不太热衷于放弃支持。

映射这种情况的正确方法是什么?

实体
@Embeddable
public class PostalCode {
@Column(name = "postalCode", length = 5)
@Pattern(regexp = "[0-9}{5}")
private String value;

// Getter and setter for value

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof PostalCode)) {
return false;
}
PostalCode that = (PostalCode) o;
return new EqualsBuilder().append(this.value, that.value).isEquals();
}

@Override
public int hashCode() {
return new HashCodeBuilder().append(this.value).toHashCode();
}
}

在另一个类中,我尝试将其用作 @ElementCollection :
@Valid
@ElementCollection(targetClass = PostalCode.class)
@CollectionTable(name="PostalCodes", joinColumns = @JoinColumn(name = "postOffice_id"))
private Set<PostalCode> postalCodes = new HashSet<PostalCode>();

编辑 1

进一步调查显示,如果集合的类型是 Collection<PostalCode>List<PostalCode> ,即使没有 equals/hashCode 审计也会失败实现:
// No difference in the following
private Collection<PostalCode> postalCodes = new HashSet<PostalCode>();
private Collection<PostalCode> postalCodes = new ArrayList<PostalCode>();

关于
进一步说明, EntityExistsException throw 不包含邮政编码的值:只包含外键、revision_id 和 revisionType。
// Excerpt from the exception
PostalCodesAudit#{
PostOffice_id=5,
revision_id=DefaultRevisionEntity(id = 16, revisionDate = Aug 19, 2013 11:52:14 AM),
revisionType=ADD
}

此外,将字段更改为 List<PostalCode> 后并用 @OrderColumn 注释它无论 equals/hashCode 是否正常,审核机制均正常工作实现与否。没有订单栏它仍然会中断
@ElementCollection(targetClass = PostalCode.class, fetch = FetchType.LAZY)
@CollectionTable(name = "PostOfficePostalCodes", joinColumns = @JoinColumn(name = "postOffice_id"))
@OrderColumn(name = "listOrder")
private List<PostalCode> postalCodes = new ArrayList<PostalCode>();

最佳答案

我最终通过将字段转换为 List<PostalCode> 来解决它即使这不是最佳解决方案,因为列表允许重复条目。最终的映射如下:

@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(joinColumns = @JoinColumn(name = "postOffice_id"))
@Column(name = "postalCode", unique = true)
@OrderColumn(name = "listOrder")
private List<PostalCode> deliveredPostalCodes = new ArrayList<PostalCode>();

关于hibernate - 在 JPA2/Hibernate 中使用覆盖的 equals/hashCode 审计 @Embeddables 的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18307245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com