【发布时间】:2015-02-12 18:57:42
【问题描述】:
我使用 Hibernate 作为我的 JPA 提供程序,并且我希望在调用 save() 时忽略实体中的一个字段。但是,我在相应的数据库表中确实有一个匹配列,并且我希望在获取实体时用数据库值填充我的实体字段。所以,我希望在保存实体时忽略该字段,而不是在获取它时。
如果我使用@Transient,该字段将被完全忽略,这不是我想要的。有没有办法做到这一点?
【问题讨论】:
我使用 Hibernate 作为我的 JPA 提供程序,并且我希望在调用 save() 时忽略实体中的一个字段。但是,我在相应的数据库表中确实有一个匹配列,并且我希望在获取实体时用数据库值填充我的实体字段。所以,我希望在保存实体时忽略该字段,而不是在获取它时。
如果我使用@Transient,该字段将被完全忽略,这不是我想要的。有没有办法做到这一点?
【问题讨论】:
来自优秀的书Pro JPA 2:
JPA 定义了将单个映射设置为只读的选项 @Column 和 @JoinColumn 的可插入和可更新元素 注释。这两个设置默认为 true 但可以设置为 如果我们要确保提供者不会插入或更新,则为 false 表中响应实体变化的信息 实例。如果映射表中的数据已经存在并且我们想要 以确保它不会在运行时被修改,然后 可插入和可更新元素可以有效地设置为 false 阻止提供者做任何事情,而不是阅读 来自数据库的实体。
@Column(insertable = false, updatable = false)
private String readOnlyField;
【讨论】:
modified_at,默认值为当前日期时间。唯一对我有用的是@UpdateTimestamp。我不需要打电话给.flush()。 @Generated 或 @GeneratedValue 注释都不起作用,即使在使用 .flush() 之后,该字段仍然会在 .save() 之后返回为 null。
java.sql.SQLSyntaxErrorException: Unknown column 'someobject0_.somereadonlyfield' in 'field list',当我尝试删除someobject 默认JpaRepository 方法:someObjectsRepository.deleteById(someObjectId)。自定义删除查询帮助了我:@Query("delete from someobject where id = :someObjectId", nativeQuery = true)