请解释一下:insertable = false,updatable = false

Tha*_*ham 132 java jpa eclipselink java-ee

如果某个字段有注释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;
}
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 109

当创建/更新相关实体的责任不在当前实体中时,您就会这样做.例如,你有一个Person和一个Address.您希望添加与实体中的实体insertable=false, updatable=false@OneToMany关系,仅仅因为创建或更新实体不是实体的责任.反过来说.PersonAddressAddressPerson

  • 我想你的意思是说'......与@ManyToOne的关系......`?? (6认同)
  • 您说的是在Person上使用updatable = false,它将在更新地址时禁用对Person.name的更新(我不同意,因为这是级联的目的)。您还说@Column定义在其外键(人)和不是外键时有所不同(因为没有引用实体禁止更新)。通过阅读javadoc中的可更新内容,我会说,如果该地址一经保存,它将只是禁用更改给定地址的Person。你能解释一下吗? (2认同)
  • 这不是已经由级联选项充分定义了吗?我发现尝试写入生成的列时不会遇到麻烦。(例如,体积列“GENERATED ALWAYS AS(高度*宽度*长度)虚拟”) (2认同)

Pas*_*ent 96

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

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

  • 我坚信这个答案比被接受的答案要好得多.接受的答案表达了可插入/可更新属性与相关实体的创建/更新有关的感觉,而这些属性背后的真实意图是防止在当前实体中插入/更新列.相关实体的创建/更新由映射注释的级联属性处理. (12认同)

Mag*_*lex 20

我想补充一下BalusCPascal Thivent的另一个常见用法insertable=false, updatable=false:

考虑一个不是id而是某种序列号的列.计算序列号的责任可能不一定属于申请.

例如,序列号从1000开始,每个新实体应递增1.这在数据库中很容易完成,非常恰当,在这种情况下,这些配置是有意义的.

  • JPA 也支持序列,因此您也可以使用 JPA 注释定义序列。 (2认同)

Joh*_*y19 7

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

  • Hibernate 是否应该根据 updateable=false 注释阻止更新?在我的 JPA 存储库中测试带有此注释的created_on 列接受更新而不会抱怨。 (2认同)
  • @chrisinmtown Eclipselink 根本不会在 sql 中包含该列。我希望它与 Hibernate 相同 (2认同)

小智 6

我想这句话的意思很简单:

boolean insertable

(可选)该列是否包含在持久性提供程序生成的 SQL INSERT 语句中。

boolean updatable

(可选)该列是否包含在持久性提供程序生成的 SQL UPDATE 语句中。

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