我有两个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 (?, ?)
答案 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>();