为清楚起见,我只放了密钥代码块。
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;
}
}
当我在网页中修改角色并提交更新数据时,我的操作会调用hibernate更新。
因为我只更新角色的名称,所以action字段为null,我得到了这样的日志:
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已被删除。
我搜索了谷歌&#39; hibernate update ignore null&#39;,并添加了@DynamicUpdate
,但它仍无效。
我知道我可以通过id获取角色实体,然后与更新实体合并(来自web提交),以使动作不为空。
但有没有像@DynamicUpdate
这样的方法,所以我可以忽略这个JoinTable null关联。要更新角色,请不要删除role_action。
答案 0 :(得分:0)
您是否尝试将此添加到您的加入列:
@JoinTable(name = "role_action", updatable = false, joinColumns = @JoinColumn(name = "roleid"),
inverseJoinColumns = @JoinColumn(name = "actionid"))