我有一个域对象,它通过@ManyToMany
注释保存另一个对象的集合:
@ManyToMany(fetch=FetchType.LAZY,cascade = { CascadeType.MERGE, CascadeType.PERSIST})
@JoinTable(name = "join_table", joinColumns=@JoinColumn(name="a_id", referencedColumnName = "a_id"), inverseJoinColumns=@JoinColumn(name = "b_id", referencedColumnName = "b_id"))
private List<B> BsList;
在联接表中,我保留了其他数据列。
我注意到当我使用保存列表的对象并调用setBsList()
时,我删除了附加列中的数据。
Hibernate每次都会在连接表中重写行吗?
答案 0 :(得分:1)
在联接表中,我保留了其他数据列。
如果您有其他数据列,则不是一个连接表。这是一张有两个FK的桌子,也可以是PK。而Hibernate正在做正确的事情。因此,您应该创建另一个表示此“伪连接表”的实体,并相应地映射它。
答案 1 :(得分:1)
你不应该致电setBsList()
,你应该直接修改getBsList()
,否则Hibernate无法跟踪发生了什么变化。
加载时,您获得的实际List
是一个特定于Hibernate的实现,它处理延迟加载并跟踪添加和删除的内容,以便可以正确更新。如果用不同的列表实现替换它,它将删除旧的列表,只添加然后只添加新条目。当Hibernate与集合一起使用时,最好让setter受到保护,这样你就不会意外地做到这一点。