在不使用Transient字段的情况下,是否可以仅在JPA中分离一个字段而不是整个实体?

时间:2018-10-18 20:05:26

标签: jpa jpa-2.0

在我的应用程序的特定类中有两个字段,我需要应用一个称为scale的属性,例如转换。在这种情况下,将在屏幕上显示的值与数据库值不对应。

@Entity
@TableGenerator(...) 
public class Value implements Serializable {

    @Id
    @GeneratedValue(...)
    private Integer id;

    private Double start;  //Field to apply and reverse scale
    private Double end;    //Field to apply and reverse scale
    private Integer scale; //Scale that will be used...

    //GETTERS and SETTERS...

所以,我有两种情况:

  1. 我在加载实体时需要应用比例尺;
  2. 而且,在保存/合并/保留实体时,我需要调换比例

因此,我为此目的开发了两种回调方法:

    @PrePersist
    @PreUpdate
    public void reverseScale() {
        start = start * scale;
        end = end * scale;
    }

    @PostPersist
    @PostUpdate
    @PostLoad
    public void applyScale() {
        start = start / scale;
        end = end / scale;
    }

我知道,一旦加载了实体对象,该实体中的所有更改都将由持久性上下文管理并自动更新到数据库中。但是,在这种情况下,这是一个问题,我以为实际上我从实体管理器功能运行保存,合并或持久化方法时,JPA仅会运行reverseScale方法(带有@PrePersist和@PreUpdate注释)。在没有执行的情况下运行实体管理器功能,在加载对象列表后立即运行,可能是因为调用了某些get或set方法。

我尝试使用AccessType策略,但是没有用:

@Access(AccessType.FIELD)
public class Value implements Serializable {

..
@Access(AccessType.PROPERTY)
public String getStart() {
    return start;
}

我担心瞬态字段将是我的解决方案,但是我正在努力避免这种情况。在这种情况下我该怎么办?我需要从数据库中加载实体时,applyScale方法仅执行一次,而当我(根据我的意愿)从entityManager运行一些保存或更新方法时,同样需要一次reverseScale方法。

是否可以“分离”一个字段而不是整个实体?另一点是要避免将这种“责任”归咎于我的“道”或“业务规则”类。在我看来,分离整个实体不是一个好的选择。 谢谢!

0 个答案:

没有答案