Java Hibernate重新写入多对多实体?

Java Hibernate重新写入多对多实体?,java,hibernate,Java,Hibernate,我有一个域对象,它通过@manytomy注释保存另一个对象的集合: @ManyToMany(fetch=FetchType.LAZY,cascade = { CascadeType.MERGE, CascadeType.PERSIST}) @JoinTable(name = "join_table", joinColumns=@JoinColumn(name="a_id", referencedColumnName = "a_id"), inverseJoinColumns=@JoinC

我有一个域对象,它通过
@manytomy
注释保存另一个对象的集合:

@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;
@ManyToMany(fetch=FetchType.LAZY,cascade={CascadeType.MERGE,CascadeType.PERSIST})
@JoinTable(name=“join\u table”,joinColumns=@JoinColumn(name=“a\u id”,referencedColumnName=“a\u id”),inverseJoinColumns=@JoinColumn(name=“b\u id”,referencedColumnName=“b\u id”))
私人名单;
在联接表中,我保留了其他数据列

我注意到,当我使用保存列表的对象并调用
setBsList()
时,我在附加列中的数据被删除。 Hibernate是否每次都重新写入联接表中的行

在联接表中,我保留了其他数据列


如果有其他数据列,则它不是联接表。这是一张有两个FK的桌子,也可以是PKs。Hibernate正在做正确的事情。因此,您应该创建另一个表示这个“伪联接表”的实体,并相应地映射它

您不应该调用
setBsList()
,您应该直接修改
getBsList()
,否则Hibernate无法跟踪更改的内容


加载时,实际得到的
列表是一个特定于Hibernate的实现,它处理延迟加载并跟踪添加和删除的内容,以便正确更新。如果您用不同的列表实现替换它,它将删除旧的列表实现,然后只添加新的条目。在集合中使用Hibernate时,最好将setter设置为受保护的,这样您就不会意外地执行此操作。

是的,我知道这不是一个“合法”的联接表,但除了上面提到的以外,没有到联接表的映射。hibernate是否会识别这些附加字段,从而导致行为,或者hibernate是否总是执行这些重新写入操作?否,如果我没有记错的话,hibernate会删除所有“链接”并重新创建它们,而不是识别现有链接并更新/创建/删除更改。因此,虽然它们看起来是相同的记录,但实际上是新的记录。