请参考JPA @Column注释解释有关insertable = false和updatable = false的信息


151

如果对字段进行了注释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;
}

Answers:


120

当有关实体的创建/更新责任不在当前实体中时,您可以这样做。例如,您有一个Person和一个Address。您想添加与实体中实体insertable=false, updatable=false@OneToMany关系,仅仅是因为创建或更新并不是实体的责任。相反。PersonAddressAddressPerson


它是指insertable=false,updatable=false在关系的一侧进行定义。
BalusC

3
您说的是在Person上使用updatable = false,它将在更新地址时禁用对Person.name的更新(我不同意,因为这是级联的目的)。您还说@Column定义在其外键(人)和不是外键时有所不同(因为没有引用实体禁止更新)。通过阅读javadoc中的可更新内容,我会说,如果持久保存给定的地址,它将只是禁用更改Person。你能解释一下吗?
飘逸的

8
我想你是想说... to the @ManyToOne relationship with the ...??
Martin Konecny

110

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

这不是IMO的语义问题,而是绝对的技术问题。


15
我坚信,这个答案比公认的答案要好得多。接受的答案传达出一种感觉,即可插入/可更新属性与相关实体的创建/更新有关,而这些属性背后的真正意图是防止列在当前实体中的插入/更新。相关实体的创建/更新由映射注释的层叠属性解决。
Jayant 2015年

25

我想在BalusCPascal Thivent的答案中添加另一个常见用法insertable=false, updatable=false

考虑一个不是id而是某种序列号的列。计算序列号的职责可能不一定属于应用程序。

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


1
JPA也支持序列,因此您也可以使用JPA批注定义序列。
eis 2015年

8

另一个示例将在“ created_on”列上,您要让数据库处理创建日期


Hibernate是否应该基于可更新的= false注释阻止更新?在我的JPA存储库测试中,带有此批注的created_on列接受更新而没有任何抱怨。
chrisinmtown

1
@chrisinmtown Eclipselink根本不会在sql中包含该列。我希望它是与Hibernate一样
Jaqen H'ghar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.