【问题标题】:JPA: ignore field on save, but fetch on selectJPA:保存时忽略字段,但选择时获取
【发布时间】:2015-02-12 18:57:42
【问题描述】:

我使用 Hibernate 作为我的 JPA 提供程序,并且我希望在调用 save() 时忽略实体中的一个字段。但是,我在相应的数据库表中确实有一个匹配列,并且我希望在获取实体时用数据库值填充我的实体字段。所以,我希望在保存实体时忽略该字段,而不是在获取它时。

如果我使用@Transient,该字段将被完全忽略,这不是我想要的。有没有办法做到这一点?

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    来自优秀的书Pro JPA 2

    JPA 定义了将单个映射设置为只读的选项 @Column 和 @JoinColumn 的可插入和可更新元素 注释。这两个设置默认为 true 但可以设置为 如果我们要确保提供者不会插入或更新,则为 false 表中响应实体变化的信息 实例。如果映射表中的数据已经存在并且我们想要 以确保它不会在运行时被修改,然后 可插入和可更新元素可以有效地设置为 false 阻止提供者做任何事情,而不是阅读 来自数据库的实体。

    @Column(insertable = false, updatable = false)
    private String readOnlyField;
    

    【讨论】:

    • 这对我有帮助,但是如何获取该值,例如,该值默认生成到我的数据库中?
    • 这种情况下,忽略该字段,不返回数据库生成的值,保持为null
    • 我遇到了你描述的同样的问题。我有一个由数据库自动生成的字段(默认值),它没有被 save 方法返回,它只是返回 null。我曾尝试在保存后调用 .flush() ,但这也不起作用。你查到真相了吗?
    • 更新:就我而言,我有一个列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)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 2012-06-27
    • 2014-12-13
    相关资源
    最近更新 更多