java 请参考JPA @Column注解解释insertable=false和updatable=false

zed5wv10  于 2023-05-27  发布在  Java
关注(0)|答案(8)|浏览(627)

如果一个字段被注解为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;
}
lqfhib0f

lqfhib0f1#

当创建/更新引用列的实体的责任不在当前实体中,而是在另一个实体中时,您可以这样做。

b4qexyjb

b4qexyjb2#

定义insertable=false, updatable=false在需要多次Map实体中的字段时非常有用,通常是:

  • 当使用复合密钥时
  • 当使用共享主键时
  • 使用级联主键时

这是IMO不是一个语义的东西,但绝对是一个技术。

hgc7kmma

hgc7kmma3#

我想在 BalusCPascal Thivent 的答案中添加insertable=false, updatable=false的另一个常见用法:
考虑一个不是 id 而是某种序列号的列。计算序列号的责任可能不一定属于应用程序。
例如,序列号以1000开始,并且对于每个新实体都应递增1。这在数据库中很容易完成,而且非常合适,在这种情况下,这些配置是有意义的。

uxh89sit

uxh89sit4#

另一个例子是在“created_on”列上,您希望让数据库处理日期创建

cetgtptt

cetgtptt5#

我认为它只是意味着:
列是否包含在持久性提供程序生成的SQL INSERT语句中。
参考:https://www.objectdb.com/api/java/jpa/Column

1dkrff03

1dkrff036#

另一个原因可能是属性Map到视图的列(例如,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;

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

fhg3lkii

fhg3lkii7#

除了前面的答案之外,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列中的任何值,该值仅由父实体编辑/更新。

jgzswidk

jgzswidk8#

根据Javax的持久性文档:
列是否包含在持久性提供程序生成的SQL UPDATE语句中。
最好从这里的官方文档中了解。

相关问题