【问题标题】:Setting JoinColumn parameters insertable and updatable to null将可插入和可更新的 JoinColumn 参数设置为 null
【发布时间】:2023-03-11 02:34:01
【问题描述】:

我在 Internet 上看到了几个关于使用 JoinColumn 的示例,如下例所示。

实际上,关于这个特殊的例子,我想问你两个问题。难道我们不能通过在 JoinColumn 中添加一个“nullable=false”参数来摆脱“可选”参数吗?可选和可为空的实体关系之间有什么区别吗?在 joincolumn 中将 insertable 和 updateable 设置为 false 有什么好处?这样做是为了确保 Employee 实体不能更新 Department 实体吗?

@Entity
public class Employee {
  // ...

  @ManyToOne(optional=false)
  @JoinColumn(name="DEPT_ID", insertable=false, updatable=false)
  private Department department;
  // ...
}

【问题讨论】:

    标签: java orm jpa jakarta-ee


    【解决方案1】:

    ManyToOne 上的optional = false 是持久性框架在构建java 对象时解释的运行时指令。 JoinColumn 上的nullable = true 用于设置数据库架构,可能会或可能不会在运行时解释,具体取决于您的持久性提供程序。

    通常,JoinColumn 映射以这种方式完成,以表明关系是由另一方管理的。

    您可能会:

    @OneToMany(cascade=CascadeType.ALL)
    @JoinColumn(name="DEPT_ID")
    private Set<Employee> employees;
    

    在您的部门上,您可以通过将它们添加到那里的集合中来创建新的员工-部门关系,而不是在员工上设置部门。这就是您将 Employee 的部门标记为不可更新的原因,因为该部门“拥有”修改关系的能力。

    【讨论】:

    • 实际上,Department 实体中的 Set 员工不需要 JoinColumn,因为外键已经在 Employee 上。并且由于员工与部门具有多对一关系,并且由于它包含外键,所以这不使它成为关系的所有者吗?此外,在这种情况下,Deparment 将具有 OneToMany(mappedyBy=department),因为这是一种双向关系。
    • 这将是ManyToOne方拥有的双向关系,是的。我说明了另一种选择,即 OneToMany 方拥有的关系,其中 JoinColumn 在 OneToMany 上使用而不是 mappedBy。这是真的,没有必要。这是一种提供略有不同行为的替代方案。正如您所询问的,它是在 ManyToOne 端通常使用 updatable=false 和 insertable=false 的映射。
    • 我认为最终将 JoinColumn 中的可更新和可插入设置为 false 与在 Column (非关系字段)中设置可更新和可插入为 false 的工作方式相同。您根本无法修改(外键)字段。嗯,这种方法更适合遗留数据库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 2012-05-09
    • 2016-10-26
    • 2011-03-19
    • 2017-04-04
    相关资源
    最近更新 更多