Spring Data CrudRepository级联删除@OneToMany Unidirectional

时间:2012-01-06 04:44:51

标签: hibernate jpa

晚上好,

我有一个带有以下签名的字段:

@OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL, orphanRemoval=true)
@JoinColumn(name="username")
private Collection<UserAuthority> authorities; 

当我尝试从集合中删除UserAuthority时,它会通过将username设置为null而不是删除来尝试更新。

删除:

...
authorities.remove(targetAuthority);
user.setAuthorities(authorities);
repo.save(user);
...

这是对的吗?

我可以让它正确级联删除的唯一方法是,如果我有一个单独的UserAuthority存储库并执行类似以下的操作

...
authRepo.delete(authorities);
...

任何帮助都会很棒!

谢谢!

1 个答案:

答案 0 :(得分:1)

如果您将此代码映射为双向关系,则上面提供的代码将起作用:

 @OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL, orphanRemoval=true, mappedBy="user")   
 private Collection<UserAuthority> authorities;

然后在UserAuthority:

@ManyToOne
@JoinColumn(name="username")
private User user;

MappedBy告诉Hibernate UserAuthority是拥有实体,即它具有定义关联的外键。因此,当您要保存新的UserAssociation实体时,需要确保设置引用的用户。

这也将导致更优化的保存过程,因为Hibernate可以使用正确的外键插入UserAuthority记录,而不是执行插入然后更新以设置它。