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
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 />.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With