Hibernate删除所有并在为ManyToMany关系添加新项目时重新插入所有包括集合中的新项目

时间:2016-01-19 06:01:19

标签: hibernate

我有两个A和B类,而A类有成员变量让我们说bCollection包含B的集合,它是HashSet,但是B类并不把A类作为成员变量。在hibernate中,我为成员变量bCollection定义了@ManyToMany关系,并且我还在A类和B类中正确配置了hascode和equals方法。

现在问题是每当我在bCollection中添加B时,它首先从DB中删除所有B,然后重新插入新的。我无法理解为什么如果A有很大的B集合,它只是插入新的B作为一个大问题而不添加新的B.

注意 - 它故意只有一种方式关系

参考代码和控制台输出 -

@Entity
@Table(name=“A”)
public class A {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;
    @ManyToMany
    @JoinTable(name=“A_B”,joinColumns=@JoinColumn(name=“B_id"))
    private Collection<B> bCollection = new HashSet<B>();
}

@Entity
@Table(name=“B”)
public class B {
      @Id
      @GeneratedValue(strategy=GenerationType.IDENTITY)
      private int id;
}

控制台输出 - 将新B添加到bCollection中,然后更新A

 Hibernate: delete from A_B where A_id=?
 Hibernate: insert into A_B (A_id, B_id) values (?, ?)
 Hibernate: insert into A_B (A_id, B_id) values (?, ?)
 Hibernate: insert into A_B (A_id, B_id) values (?, ?)

1 个答案:

答案 0 :(得分:0)

@Nathan Kummer是正确的,使用Set代替Collection可能会修复它。之前是StackOverflowed here,还有bloged here

原始答案

你可能也需要这个。

首先,joinColumns应指向拥有关联的实体。第二,你需要定义inverseJoinColumns - 关联的反面

@JoinTable(name="A_B", 
   joinColumns = @JoinColumn(name="A_id"),
   inverseJoinColumns = @JoinColumn(name = "B_id"))
private Collection<B> bCollection = new HashSet<B>();