同时在Hibernate中使用@Column和@Formula

时间:2017-12-07 16:05:35

标签: java hibernate jpa orm

我有一个POJO,目前我从一个列中获得了一个值。但是,我正在使用Hibernate @Formula(我从另一个表中选择最新记录)来检索它。我想轻声一点,以免破坏任何东西。

所以我想做的是这样的事情:

class SomeDto {
    private someField;

    @Column("PREVIOUS_FIELD_COLUMN", nullable = false, length = 1)
    @Formula("@NEW RETRIEVING LOGIC@")
    public getSomeField() {
    ...
}

这样我就可以在someField中存储PREVIOUS_FIELD_COLUMN值,同时根据新条件检索值。

但是现在看来Hibernate忽略了@Column注释,因为我收到以下错误:

  

SQLIntegrityConstraintViolationException:ORA-01400:无法插入   NULL进入

我在日志中看到Hibernate在生成的insert语句中跳过PREVIOUS_FIELD_COLUMN(不列出它并且不从POJO设置值)。

任何帮助表示感谢,非常感谢!

2 个答案:

答案 0 :(得分:2)

您可以选择将之前的值重新映射到新字段,以便继续保留旧记录,并将旧值重新映射到@Formula逻辑。

public class SomeEntity {
  @Formula("your new formula logic");
  public Object getSomeField() {}

  @Column(name= "PREVIOUS_VALUE")
  public Object getPreviousValue() {}
}

您的帖子听起来就像您所关注的那样,技术上允许您的应用程序仍然以相同的方式与对象进行交互,但您希望从其他地方获取值;但是,能够保留对旧值的访问和存储。

上述解决方案允许这样做。

答案 1 :(得分:2)

我认为您将使用ColumnTransformer而不是像这样的公式

  class SomeDto {
    private someField;


    @Column("PREVIOUS_FIELD_COLUMN", nullable = false, length = 1)
    @ColumnTransformer(read = “@NEW RETRIEVING LOGIC@”)
    public getSomeField() {
    ...
  }

有关详细信息,请参阅此https://www.thoughts-on-java.org/map-encrypted-database-columns-hibernates-columntransformer-annotation/