将实体类(Song)与@OneToMany映射到另一个实体(CoverArt)并级联设置为ALL,因为看起来更容易保存主entiy让它来坚持封面在休眠时使用CascadeType.ALL保存顶级实体会导致对相关实体的不必要更新
@Audited
@Entity
public class Song
{
@Id
@GeneratedValue
private Integer recNo;
@Version
private int version;
@OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
private List<CoverArt> coverArts;
....
}
的照顾,而且我发现在代码稍后,如果我只是检索和数据库中的类的实例,然后会在短短修改歌曲实体中的一个字段会导致它更新与该歌曲链接的所有封面艺术实体,即使封面艺术没有任何改变,为什么它会这样做?
此外,我不认为它会导致问题,但我正在使用Envers,并且对CoverArt表的(看似)不必要的额外更新具有造成Envers创建不必要的审计表的敲击作用。
如果我删除CascadeType注释修改一个字段不会导致封面艺术实体更新,并且一切正常,只要我添加额外的逻辑,当我添加封面艺术,但我希望我没有'不需要这样做。
你以某种方式改变coverArts收集的实例?可能是因为休眠失去了更改跟踪。另外,如果CoverArt对Song有反向引用,最好在@OneToMany上反转= true。 – Firo 2012-02-29 13:02:40
这是什么意思,我没有对coverart做任何修改。它没有反向引用, – 2012-02-29 14:28:15
Hibernate以某种方式认为CoverArts已经改变。如果Hibernate设置为字段的集合被交换,或者如果所有属性的值都不相等,因为它们以某种方式更改,那么引用父对象。为CoverArt设置dynamicupdate = true以查看哪些字段实际上正在更改。 – Firo 2012-02-29 15:26:53