【问题标题】:hibernate update when @JoinTable null auto delete join table@JoinTable null 自动删除连接表时休眠更新
【发布时间】: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。

【问题讨论】:

    标签: hibernate null jointable


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答。 updatable 好像老了。我使用hibernate-4.3.6,hibernate-jpa-2.1。 JoinTable 没有updatable 字段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 2013-08-20
    • 2010-11-21
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    相关资源
    最近更新 更多