3
저장 프로 시저를 호출하여 ejb 메서드에서 비동기 트랜잭션 작업을 수행하려고합니다. 나는 methot를 호출 할 때 나는 오류가 아래 제공 :JTA EntityManager는 저장 프로 시저 호출에서 getTransaction()을 사용할 수 없습니다.
java.lang.IllegalStateException: A JTA EntityManager cannot use getTransaction()
콩
@Stateless
public class FileSearchDAO {
private static Logger logger = LoggerFactory.getLogger(FileSearchDAO.class);
@PersistenceContext(unitName = "FileSearchPU")
private EntityManager entityManager;
@Asynchronous
public Future<String> saveFile(String fileNo, List<String> runningFiles) {
try {
entityManager.getTransaction().begin();
entityManager.createNativeQuery(
" BEGIN prc_save_file (:fileNo); END;")
.setParameter("fileNo", fileNo).executeUpdate();
entityManager.getTransaction().commit();
runningFiles.remove(fileNo);
return new AsyncResult<>(fileNo);
} catch (Exception ex) {
ex.printStackTrace();
return new AsyncResult<>(ex.getMessage());
}
}
에게이 persistence.xml에게
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<persistence-unit name="FileSearchPU" transaction-type="JTA">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>jdbc/FileSearchDS</jta-data-source>
<properties>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.transaction.jta.platform"
value="${hibernate.transaction.jta.platform}"/>
</properties>
</persistence-unit>
</persistence>
을 내가 어떤 엔티티 클래스를하지 않았습니다. 난 그냥 테이블을 업데이 트하는 저장 프로 시저를 호출하고 싶습니다.
감사와 같은 트랜잭션을 사용하려면 사용해야합니다. em.joinTransaction()도 필요합니까? –
@ mohammad_1m2 필자는 저장 프로 시저에서 발생하는 상황을 지속성 컨텍스트가 알지 못하기 때문에 필요하지 않거나 중요하지 않다고 생각합니다. 하지만 당신이 엔티티를 다루는 경우에 그렇습니다. 아직도 사용하면 해를 끼치 지 않을 것입니다. – pirho