Java Hibernate双向多对多关联创建重复项
我的问题和这个很相似 我已经完成了如下所示的课程Java Hibernate双向多对多关联创建重复项,java,hibernate,caching,Java,Hibernate,Caching,我的问题和这个很相似 我已经完成了如下所示的课程 @Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL) @Entity public class A{ private int id; private List<B> listB; ... @Cache (usage = CacheConcurrencyStrategy.TRANSACTIONAL) @ManyToMany(ca
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
@Entity
public class A{
private int id;
private List<B> listB;
...
@Cache (usage = CacheConcurrencyStrategy.TRANSACTIONAL)
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, targetEntity = B.class)
@JoinTable(name = "A_B", joinColumns = { @JoinColumn(name = "a_id") },
inverseJoinColumns = { @JoinColumn(name = "b_id") })
public List<B> getListB() {
return listB ;
}
}
@Cache (usage = CacheConcurrencyStrategy.TRANSACTIONAL)
@Entity
public class B{
private int id;
private List<A> listA;
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, targetEntity = A.class)
@JoinTable(name = "A_B", joinColumns = { @JoinColumn(name = "b_id") }, inverseJoinColumns = { @JoinColumn(name = "a_id") })
public List<a> getListA() {
return listA ;
}
public void addToA(A a) {
a.getListB().add(this);
}
}
以下是Hibernate从日志中获取的查询
delete from A_B where b_id=?
insert into A_B (b_id, a_id) values (?, ?)
insert into A_B (b_id, a_id) values (?, ?)
delete from A_B where a_id=?
insert into A_B (a_id, b_id) values (?, ?)
insert into A_B (a_id, b_id) values (?, ?)
insert into A_B (a_id, b_id) values (?, ?)
insert into A_B (a_id, b_id) values (?, ?)
我哪里出了问题?
如何消除插入的重复项?
缓存正在正确刷新,但唯一的问题是重复条目 这是一部经典之作
问题是两个映射都是所有者,其中一个应该是所有者,另一个应该是反向的。因为两者都是所有者,对其中一个的更改将导致数据库的插入;对于一个所有者和一个反转,将只有一组插入
您应该能够将B::getListA
重写为:
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, mappedBy = "listB")
public List<A> getListA()
@ManyToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE},mappedBy=“listB”)
公共列表getListA()
让一切顺利
请注意,只有拥有方作为@JoinTable
注释。通常,在JPA应用程序中,数据库的任何给定位都被映射到恰好一个位置。如果你发现自己映射了两次某个东西,那么仔细看看是否有更好的方法
顺便说一句,您不需要
targetEntity
属性;JPA提供商可以从泛型中解决这个问题。太好了!因此,使用mappedBy属性,我们通知Hibernate通知作为所有者表的实体的连接配置。我的理解正确吗?知道为什么在正确设置mappedBy的情况下仍然会得到重复的插入吗?在我的例子中,我使用字段访问而不是方法访问。这可能是个问题吗?我一直在努力解决类似的问题。我的@OneToMany实际上是一个单向(顺序地址)映射。最初,我使用一个集合来收集订单的地址。问题是,每当向集合中添加新的有效地址时,我都必须使旧地址的状态无效(这意味着更新现有地址并保留新的有效地址)。Hibernate正在向联接表插入重复项。我已经尝试了所有可能的解决办法。最后,将集合更改为List解决了所有问题。
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, mappedBy = "listB")
public List<A> getListA()