Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Jpa + Spring - automatically setting transient field value after read from DB

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

like image 786
lincetto Avatar asked Aug 30 '13 15:08

lincetto


1 Answers

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 />.

like image 120
Jukka Avatar answered Oct 13 '22 18:10

Jukka