gpt4 book ai didi

mysql - javax.persistence.EntityExistsException : a different object with the same identifier value was already associated with the session 异常

转载 作者:行者123 更新时间:2023-11-29 03:04:11 27 4
gpt4 key购买 nike

我有两个实体(A 和 B)。 A 与实体 B 具有一对多关系。实体 A 的主键是自增的,而实体 B 的主键是复合的(由实体 A 的 PK 作为外键和一个自增 id 组成)。

注意:我正在使用 EJB 3.1 和 MySQL,Jboss7

我从我的业务对象填充实体 A 并按以下方式创建它。

A a = new A();
Set<B> bEntitiesList = new HashSet<B>();
B b = new B();
b.setCompositeKey(new compositeKey()); // I am not setting any value in the
// key and it will have null values for idA and idB.
// idB is null because it will be auto incremented in this table by MySQL
bEntitiesList.put(b);
a.setBEntities(bEntitiesList);
entityManager.persist(a);

每当我在 bEntities 列表中传递实体 B 的一个对象时,程序就会按预期工作,数据库中的所有字段都被正确填充,但是当我在 bEntities 列表中添加多个对象实体 B 时,我会得到异常“javax.persistence.EntityExistsException:具有相同标识符值的不同对象已与 session 相关联”。我不确定如何解决这个问题。该消息清楚地表明 hibernate session 发现了重复的条目(这是由于 compositekey 覆盖了 MyEclipse 默认生成的方法,它生成相同的哈希码,但我不确定这是导致问题的原因)。请告诉我如何解决这个问题。是否需要覆盖 compositekey 类中的 equals 和 hashcode 方法?提前致谢。

public class A
{
private Integer idA;
private Set<B> bEntities = new HashSet<B>(0);
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "A", unique = true, nullable = false)
public Integer getIdA() {
return this.idA;
}
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "A")
public Set<B> getBEntities() {
return this.bEntities;
}
}

public class B
{
private compositeKey key;
private A entityA;
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name="idB",column=@Column(name="idB",nullable=false))})
public compositeKey getKey() {
return this.key;
}
public void setKey(compositeKey key) {
this.key = key;
}
@ManyToOne(fetch = FetchType.LAZY)
@MapsId("providerReferenceNo")
@JoinColumn(name = "idA", nullable = false, insertable = false, updatable = false)
public A getEntityA() {
return this.entityA;
}
}


@Embeddable
public class compositeKey {
private Integer idA;
private Integer idB;

@GeneratedValue(strategy = IDENTITY)
@Column(name = "idB", nullable = false)
public Integer getIdB() {
return this.idB;
}
@Column(name = "idA", nullable = false)
public Integer getIdA() {
return this.idA;
}

最佳答案

我认为您的问题可能与 hashCode/Equals 如何不对应于 JPA/EJB3.1 中的对象标识有关。

尝试将 hashCode/Equals 方法添加到 B,并将 bEntities 更改为列表 - 或者如果您将其保留为一个集合,则确保 hashCode/Equals 在添加到该集合之前使用的数据是水合的。您可能应该通过将 hashCode 和 equals 方法添加到 CompositeKey 并在 B 的 hashcode 和 equals 中延迟它们来做到这一点。

顺便说一句,您必须向 CompositeKey 添加 hashCode 和 Equals 方法。使用 CompositeKey 的原因之一是告诉持久性框架如何与复合键进行比较。

关于mysql - javax.persistence.EntityExistsException : a different object with the same identifier value was already associated with the session 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18465376/

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