繁体   English   中英

在 JPA 转换器中获取属性名称或列名称

[英]Get attribute name or column name in JPA converter

我有一个具有多个双值的实体,其中每个值在存储之前都必须乘以某个因子。

我想使用(单个)JPA 转换器将属性与特定因子相乘,但因此我需要知道我在转换器函数中转换哪个属性。

有没有办法在转换器函数中获取属性名称或列名或将其传递给转换器?

我不知道您的实体是什么样子,但也许 @Access 注释可能会有所帮助 - 当您需要在读取或写入数据库时​​对数据执行简单转换时可以使用它(在这种情况下,乘法发生在保存之前通过 setter 但 getter 给出存储在 db 中的确切值)。 不便之处在于您需要将它添加到每个需要此转换的 setter 上:

@Entity
@Access(AccessType.FIELD)
public class Item {

    private static final long FACTOR = 5;

    @Id
    private long id;

    private String name;

    @Transient
    private long amount;

    // getter and setters for id and name

    @Access(AccessType.PROPERTY)
    public long getAmount() {
        return amount;
    }

    public void setAmount(long amount) {
        this.amount = amount * FACTOR;
    }
}

我建议使用实体生命周期侦听器而不是转换器。 转换器是可重用的概念,可将任何 Java 数据类型映射到 JPA 类型。 他们现在与您的特定实体或领域无关。 另一方面,生命周期侦听器只能为整个实体定义,因此您必须为每个实体创建侦听器并以侦听器知道要转换哪些字段的方式进行设计。

例如,可以在实体的数据被持久化(插入)、更新之前或在另一侧,也可以在数据加载回实体之后调用实体侦听器。

您至少需要使用@PrePersist ,它会在您的新实体插入数据库之前触发您的方法 - 在这种方法中,您有机会乘以您的数据或做任何您想做的事情。 可能是,当从数据库读取实体时,您还希望将数据从数据库转换为持久化之前的初始形式。 然后您还应该使用@PostLoad来转换回数据。 最后,如果您想对更新再次应用转换,您应该使用@PreUpdate (您可以在同一方法上同时使用@PrePersist@PreUpdate )。

下面是一个例子:

@Entity
public class Item {
  @Id
  private long id;

  // this value will be multiplied by 10 when stored in DB
  private long size;
  // this value will be multiplied by 2 when stored in DB
  private long amount;

  @PrePersist
  @PreUpdate
  public void convertToDbFormat() {
    size = size * 10;
    amount = amount * 2;
  }

  @PostLoad
  public void convertFromDbFormat() {
    size = size / 10;
    amount = amount / 2;
  }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM