6

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

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

提前致谢

4

2 回答 2

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;
    }
}

注意半伪代码。请注意,后一种方法仅在您将编译时或加载时 AspectJ 编织与<context:spring-configured />.

于 2013-08-31T21:38:51.270 回答
0

您得到了具有瞬态字段的实体,并且该值始终使用 DI 从服务中获取?

  1. 该领域的目的是什么?它用于任何实体方法中的某些计算?
  2. 这样的计算大概应该使用服务的方法来获取值。
  3. 由于使用了任何服务的值,我不确定这种计算(方法)是否属于实体。

请注意,实体和服务具有完全不同的生命周期。价值随着时间的推移而变化,所以在实体的生命之初提供价值是没有意义的?

于 2013-08-30T19:53:45.793 回答