Question

what's the best solution to set a value for a field marked @Transient after the entity has been read from the data source?

I'm using EclipseLink and I'm trying the DescriptorEventAdapter with his postBuild event solution because I need also to get the default value using a Spring bean (obviuosly using DI), but I would know if there is any simpler solution that I'm missing.

Thanks in advance

Was it helpful?

Solution

Here's the simple approach if you're using a repository or 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;
    }
}

Here's another approach if you are using active record -style entities:

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

Mind the semi-pseudo-code. Note that the latter approach works only if you use compile- or load-time AspectJ weaving with <context:spring-configured />.

OTHER TIPS

You got entity which has transient field and the value is always taken from service using DI?

  1. What is the purpose of the field? It's used for some calculation within any entity method?
  2. Such calculation should probably use service's method to obtain the value.
  3. As value from any service is used, I'm not sure whether such calculation (method) belong into entity.

Note that entity and service has completely different lifecycle. The value is changing in the time so it does not make the sense to supply the value in entity's factory at the beginning of it's life?

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top