@JoinTable null自动删除连接表时的hibernate更新

时间:2016-01-06 06:13:01

标签: hibernate null jointable

为清楚起见,我只放了密钥代码块。

3个表:role,action,role_action。

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。

1 个答案:

答案 0 :(得分:0)

您是否尝试将此添加到您的加入列:

@JoinTable(name = "role_action", updatable = false, joinColumns = @JoinColumn(name = "roleid"),
        inverseJoinColumns = @JoinColumn(name = "actionid"))