请参照 JPA@Column 注释解释一下 insert table = false 和 updatable = false

如果字段是带注释的 insertable=false, updatable=false,这是否意味着您不能插入值或更改现有值?你为什么要这么做?

@Entity
public class Person {


@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;


@OneToMany(mappedBy="person", cascade=CascadeType.ALL)
private List<Address> addresses;
}


@Entity
public class Address {


@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;


@ManyToOne
@JoinColumn(name="ADDRESS_FK")
@Column(insertable=false, updatable=false)
private Person person;
}
195022 次浏览

如果创建/更新引用列的 责任不在 目前实体中,而是在 另一个实体中,那么可以这样做。

当需要在实体中多次映射一个字段时,定义 insertable=false, updatable=false非常有用,通常如下:

这不是一个语义上的问题,而是一个技术上的问题。

我想补充一下 BalusC帕斯卡 · 蒂文特的答案,insertable=false, updatable=false的另一个常见用法是:

考虑一个不是 身份证而是某种 序列号的列。计算序列号的责任不一定属于应用程序。

例如,序列号从1000开始,对于每个新实体应该递增一。这在数据库中很容易做到,而且非常适当,在这种情况下,这些配置是有意义的。

另一个例子是“ create _ on”列,您希望在该列中让数据库处理日期创建

根据 Javax 的持久性文档:

该列是否包含在持久性提供程序生成的 SQLUPDATE 语句中。

最好是从官方文档 给你中了解。

另一个原因可能是您的属性映射到视图的列(例如,您的 hibernate 实体是表和视图的融合)。因此,插入(或更新)列是没有意义的。

@Entity
@Table(name = "THE_VIEW")
@SecondaryTable(name = "THE_TABLE", pkJoinColumns = @PrimaryKeyJoinColumn(name = "THE_ID"))
public class MyEntity {


@Id
@Column(name = "THE_ID")
private Integer id;


@Column(name = "VIEW_COLUMN", updatable = false, insertable = false)
private String viewColumn


@Column(name = "TABLE_COLUMN", table = "THE_TABLE")
private String tableColumn;

(我在这里不讨论可更新的视图)

除了前面的答案之外,insertable=false, updatable=false的一个常见用法是保存冗余的数据库查询,从而提高性能。

假设有一个 Client 类,它有一个 Parent 实体。如果只想检查 Client 是否有 Parent,只需检查其 parent_id列中是否存在值。没有必要要求 Hibernate 获取 Parent 实体,可能还有它的所有其他关联,这会导致额外的查询数量:

public class Client {
@ManyToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST}, fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
private Parent parent;


@Column(name = "parent_id", insertable = false, updatable = false)
private UUID parentId;
}

通过上面的设置,parentId字段将简单地获取存储在 parent_id列中的任何值,该列仅由 Parent 实体编辑/更新。

我认为它的意思很简单:

该列是否包含在持久性提供程序生成的 SQLINSERT 语句中。

参考资料: https://www.objectdb.com/api/java/jpa/Column