【发布时间】:2016-01-06 06:13:00
【问题描述】:
为了清楚起见,我只放了关键代码块。
3 个表:角色、动作、角色动作。
role_action 是中间表,有 2 个外键:roleid,actionid。
@SuppressWarnings("serial")
@Entity
@DynamicUpdate
@Table(name = "role", schema = "test")
public class Role implements Serializable {
private String id;
private String name;
...
private List<Action> action;
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "role_action", joinColumns = @JoinColumn(name = "roleid"),
inverseJoinColumns = @JoinColumn(name = "actionid"))
public List<Action> getAction() {
return action;
}
}
当我在网页中修改角色并提交更新数据时,我的操作调用休眠更新。
由于我只更新角色的名称,所以动作字段为空,我得到了这样的日志:
2016-01-06 13:44:05,011 {Slf4jLogger.java:16} - createCompositeTransaction ( 300000 ): created new ROOT transaction with id 172.16.20.151.tm0002700023
Hibernate: update test.ROLE set name=? where ID=?
Hibernate: delete from ROLE_ACTION where ROLEID=?
是的,role_action 已被删除。
我用'hibernate update ignore null'搜索了谷歌,并添加了@DynamicUpdate,但它仍然无法正常工作。
我知道我可以通过 id 获取角色实体,然后与更新实体(来自网络提交)合并,以使操作不为空。
但是有没有像@DynamicUpdate 这样的方法,让我可以忽略这个JoinTable 空关联。只更新角色,而不是删除 role_action。
【问题讨论】: