Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate双向多对多关联创建重复项_Java_Hibernate_Caching - Fatal编程技术网

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()