1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Spring Hibernate/JPA e Domain Drive Design. Como implementar um hibernate interceptor com EntityManagerFactory?

Prezados, estou tentando adaptar um projeto simples para DDD(Domain Drive Design) e me deparei com o desafio de injetar as minhas dependencias nas entidades do modelo (hibernate entities). O que fiz até agora foi:

@Component
public class RepositoryInterceptor extends EmptyInterceptor implements
        ApplicationContextAware {

    private static final long serialVersionUID = 7576960375421845424L;

    private ApplicationContext applicationContext;

    public RepositoryInterceptor() {
    }

    @Override
    public boolean onLoad(Object entity, Serializable id, Object[] state,
            String[] propertyNames, org.hibernate.type.Type[] types) {
        if (entity instanceof SysUser) {
            SysUserRepository repository = applicationContext
                    .getBean(SysUserRepository.class);
            ((SysUser) entity).setRepository(repository);
        }
        return super.onLoad(entity, id, state, propertyNames, types);
    }

    @Override
    public void setApplicationContext(
            final ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

}

E no application context deixei da seguinte forma:

<bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="loadTimeWeaver">
            <bean
                class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
        </property>



        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="generateDdl" value="true" />
                <property name="showSql" value="true" />
            </bean>
        </property>
        <property name="jpaPropertyMap">
            <map>
                <entry key="hibernate.ejb.interceptor"
                    value="br.com.ecommerce.business.entities.interceptors.RepositoryInterceptor">
                </entry>
            </map>
        </property>
    </bean>

Mas o ApplicationContext não está sendo injetado, causando nullPointerException. Pelo que entendi o meu interceptor não está sendo criado pelo Spring e sim pelo Hibernate, como faço para criá-lo pelo spring e depois passá-lo para o Hibernate?

Alguém aí encontrou alguma solução usando EntityManagerFactory e não o SessionFactory?

As soluções que encontrei usam o SessionFactory injetando o EntityInterceptor, mas eu gostaria de usar o EntityManager.

Nesse link http://goo.gl/URhq1Y existem 4 formas de fazê-lo contudo a forma que eu preciso só é feita com o SessionFactory

Aqui http://goo.gl/SLSO6Q foi indicado reescrever o PersistenceProvider e assim injectar o interceptor. O que implica manipular uma classe Deprecated.

Desde já, agradeço toda ajuda.

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags hibernate jpa ddd spring injeção-de-dependências ou faça a sua própria pergunta.