JPA sem transação
Eu sou novo no JPA. Estou desenvolvendo um aplicativo que usa JPA (implementação do Hibernate) e Spring. Declarei uma unidade de persistência no meu persistence.xml e configuração sobre EntityManagerFactory nos meus arquivos de configuração do Spring. Algo assim:
<bean id="myEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="my.package" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">create-drop</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
</props>
</property>
Então, eu tenho alguns DAOs em que injeto o entityManager com a anotação @PersistenceContext:
public MyDaoImpl implements MyDao{
private EntityManager entityManager;
@PersistenceContext
private void setEntityManager(EntityManager em){
this.entityManager = em;
}
}
E, finalmente, tenho alguns serviços onde os DAOs são injetados (pela anotação do @Autowired Spring):
public MyServiceImpl implements MyService{
@Autowired
private MyDao myDao;
public List<MyEntity> readOperation(){
//
return myDAo.searchAll();
}
}
Como é uma operação somente leitura, pensei que não era necessária a anotação @Transactional, mas sem ela, há uma exceção:
java.lang.IllegalStateException: No transactional EntityManager available
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:223)
at $Proxy121.unwrap(Unknown Source)
Eu li alguns outros posts como este:java.lang.IllegalStateException: nenhum Transity EntityManager disponível
E tudo o que se diz é que a anotação transacional é necessária. É verdade que funciona com ele, mas eu gostaria de saber (e por que) se todos os métodos (mesmo operações somente leitura) devem ser transacionais.