Jpa + Spring - 从DB读取后自动设置瞬态字段值

时间:2013-08-30 15:49:13

标签: spring jpa eclipselink spring-data-jpa transient

在从数据源读取实体后,为标记为@Transient的字段设置值的最佳解决方案是什么?

我正在使用EclipseLink,我正在使用他的postBuild事件解决方案尝试DescriptorEventAdapter,因为我还需要使用Spring bean获取默认值(显然使用DI),但我知道是否有更简单的解决方案我失踪了。

提前致谢

2 个答案:

答案 0 :(得分:6)

如果您使用的是存储库或DAO,这是一种简单的方法:

@Repository
class YourRepository {

    @Autowired
    private Bean bean;

    @PersistenceContext
    private EntityManager entityManager;

    @Transactional(readOnly = true)
    public YourEntity find(..) {
        YourEntity entity = lookupUsingEntityManager();
        entity.transientField = bean.getDefaultValue();
        return entity;
    }
}

如果您使用的是活动记录式实体,这是另一种方法:

@Entity
class YourEntity {

    @Transient
    public Object field;

    @PostLoad
    public void populateField() {
        field = new BeanHolder().bean.getDefaultValueForField();
    }

    @Configurable
    private static class BeanHolder {
        @Autowired private Bean bean;
    }
}

注意半伪代码。请注意,后一种方法仅适用于使用<context:spring-configured />编译或加载时AspectJ编织。

答案 1 :(得分:0)

你有一个具有瞬态场的实体,并且总是从使用DI的服务中获取值?

  1. 该领域的目的是什么?它用于任何实体方法中的某些计算?
  2. 这样的计算应该使用service的方法来获取值。
  3. 当使用任何服务的值时,我不确定这样的计算(方法)是否属于实体。
  4. 请注意,实体和服务的生命周期完全不同。价值在时间上发生变化,因此在实体工厂生命之初提供价值是没有意义的吗?