【问题标题】:Read-only association with JPA OneToMany mapping与 JPA OneToMany 映射的只读关联
【发布时间】:2011-06-22 04:55:00
【问题描述】:

我有一个与另一个实体关联的事务实体,因此不应在案例中更新关联的实体。

例如。案例 *-> 用户

一个案例由一个用户拥有,相反,一个用户可以拥有许多关联的案例。

使用 OneToMany 和 JoinColumn JPA 注释映射关联。

我还尝试将用户实体的 Trasactional 注释标记为只读,并将获取方法设置为瞬态。但是,如果用户的状态发生变化,这似乎不会停止更新用户。

请帮我想出一个向用户声明“只读”关联的方法。

【问题讨论】:

    标签: java spring hibernate jpa orm


    【解决方案1】:

    您可以在@JoinColumn 注释上添加updatable=false

    此外,您不应在Case 实体中为user 添加setter 方法,在User 实体中为caseSet 添加相同的方法。 User 实体中的 getter getCaseSet 也应该返回一个不可修改的集合:

    public Set<Case> getCaseSet() {
        return Collections.unmodifiableSet(caseSet);
    }
    

    【讨论】:

    • 在为此苦苦挣扎后挽救了我的一天。确保不要添加nullable
    【解决方案2】:

    Column 注释和 XML 元素定义了可插入和可更新的选项。这些允许从 SQL INSERT 或 UPDATE 语句中省略此列或外键字段。如果表上的约束阻止插入或更新操作,则可以使用这些。如果多个属性映射到同一个数据库列,例如通过 ManyToOne 和 Id 或基本映射的外键字段,也可以使用它们。将可插入和可更新都设置为 false,有效地将属性标记为只读。

    @OneToMany映射,@JoinColumn注解中,添加bothupdatable=falseinsertable=false,然后将级联类型指定为PERSIST而不是ALL @OneToMany(cascade = CascadeType.PERSIST)

    @JoinColumn(name = "<ReadOnlyTableName>", updatable = false, insertable = false)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-15
      • 2014-11-19
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      • 1970-01-01
      • 2019-03-27
      相关资源
      最近更新 更多