如果一个字段被注解为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;
}
8条答案
按热度按时间lqfhib0f1#
当创建/更新引用列的实体的责任不在当前实体中,而是在另一个实体中时,您可以这样做。
b4qexyjb2#
定义
insertable=false, updatable=false
在需要多次Map实体中的字段时非常有用,通常是:这是IMO不是一个语义的东西,但绝对是一个技术。
hgc7kmma3#
我想在 BalusC 和 Pascal Thivent 的答案中添加
insertable=false, updatable=false
的另一个常见用法:考虑一个不是 id 而是某种序列号的列。计算序列号的责任可能不一定属于应用程序。
例如,序列号以1000开始,并且对于每个新实体都应递增1。这在数据库中很容易完成,而且非常合适,在这种情况下,这些配置是有意义的。
uxh89sit4#
另一个例子是在“created_on”列上,您希望让数据库处理日期创建
cetgtptt5#
我认为它只是意味着:
列是否包含在持久性提供程序生成的SQL INSERT语句中。
参考:https://www.objectdb.com/api/java/jpa/Column
1dkrff036#
另一个原因可能是属性Map到视图的列(例如,hibernate实体是表和视图的融合)。所以它不会让你的列可以插入(也不会更新)。
(这里不讨论可更新视图)
fhg3lkii7#
除了前面的答案之外,
insertable=false, updatable=false
的一个常见用途是保存冗余的数据库查询,从而提高性能。假设有一个Client类,它有一个Parent实体。如果你只想检查一个Client是否有Parent,你只需要检查它的
parent_id
列中是否有值。没有必要要求Hibernate获取Parent实体,可能还有它的所有其他关联,这会导致额外的查询数量:使用上面的设置,
parentId
字段将简单地获取存储在parent_id
列中的任何值,该值仅由父实体编辑/更新。jgzswidk8#
根据Javax的持久性文档:
列是否包含在持久性提供程序生成的SQL UPDATE语句中。
最好从这里的官方文档中了解。