2015-09-10 14 views
5

Stavo servendo Servlet, PostgreSQL e Hibernate con EntityManager per creare un'app Web e tutto funzionava correttamente finché non ho spostato il progetto in un progetto basato su Maven. Ora sto ottenendo questo strano eccezione ogni volta che cerco di creare un EntityManager da un EntityManagerFactory:Hibernate: impossibile accedere a TransactionManager o UserTransaction per delegare transazioni fisiche

org.hibernate.resource.transaction.backend.jta.internal.JtaPlatformInaccessibleException: Unable to access TransactionManager or UserTransaction to make physical transaction delegate 
at org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorImpl.makePhysicalTransactionDelegate(JtaTransactionCoordinatorImpl.java:229) 
at org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorImpl.getTransactionDriverControl(JtaTransactionCoordinatorImpl.java:203) 
at org.hibernate.engine.transaction.internal.TransactionImpl.<init>(TransactionImpl.java:36) 
at org.hibernate.internal.AbstractSessionImpl.getTransaction(AbstractSessionImpl.java:309) 
at org.hibernate.internal.SessionImpl.<init>(SessionImpl.java:277) 
at org.hibernate.internal.SessionFactoryImpl$SessionBuilderImpl.openSession(SessionFactoryImpl.java:1322) 
at org.hibernate.jpa.internal.EntityManagerImpl.internalGetSession(EntityManagerImpl.java:133) 
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.postInit(AbstractEntityManagerImpl.java:174) 
at org.hibernate.jpa.internal.EntityManagerImpl.<init>(EntityManagerImpl.java:83) 
at org.hibernate.jpa.internal.EntityManagerFactoryImpl.internalCreateEntityManager(EntityManagerFactoryImpl.java:311) 
at org.hibernate.jpa.internal.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:278) 
at cl.bicubic.App.getEntityManager(App.java:100) 
at cl.bicubic.dao.DAO.<init>(DAO.java:24) 
at cl.bicubic.dao.UserAtomicDAO.<init>(UserAtomicDAO.java:15) 
at cl.bicubic.Application.init(Application.java:70) 
at javax.servlet.GenericServlet.init(GenericServlet.java:158) 
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1241) 
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1154) 
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:827) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:526) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:655) 
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
at java.lang.Thread.run(Thread.java:745) 

Ecco la configurazione di Hibernate nell'unità di persistenza:

<properties> 
    <property name="hibernate.connection.url" value="jdbc:postgresql://localhost/mydb?charSet=UTF-8"/> 
    <property name="hibernate.connection.user" value="dbuser"/> 
    <property name="hibernate.connection.password" value="dbpass"/> 
    <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/> 
    <property name="hibernate.connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider"/> 
    <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL9Dialect"/> 
    <property name="hibernate.c3p0.min_size" value="5"/> 
    <property name="hibernate.c3p0.max_size" value="20"/> 
    <property name="hibernate.c3p0.timeout" value="1800"/> 
    <property name="hibernate.c3p0.max_statements" value="50"/> 
    <property name="hibernate.connection.charSet" value="UTF-8"/> 
    <property name="hibernate.hbm2ddl.auto" value="update"/> 
    <property name="hibernate.id.new_generator_mappings" value="true"/> 
    <property name="hibernate.show_sql" value="true"/> 
    <property name="hibernate.format_sql" value="true"/> 
</properties> 

Questo è il modo creo l'EntityManagerFactory:

public class App { 
    ... 
    private static EntityManagerFactory entityManagerFactory; 
    ... 
    public static void setServletContext(ServletContext context) throws IOException { 
     ... 
     entityManagerFactory = Persistence.createEntityManagerFactory("persistence-unit-name"); 
     ... 
    } 
    ... 
    public static EntityManager getEntityManager() { 
     return entityManagerFactory.createEntityManager(); //Here Throws the Exception 
    } 
    ... 
} 

io chiamo questo metodo che utilizza un ServletContextListener

@WebListener 
public class ApplicationServletContextListener implements ServletContextListener { 

    @Override 
    public void contextInitialized(ServletContextEvent sce) { 
     try { 
      App.setServletContext(sce.getServletContext()); 
     } catch (Exception ex) { 
      Logger.getLogger(ApplicationServletContextListener.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    ... 

} 

Questo è come io cerco di creare l'EntityManager

public class DAO { 
    ... 
    protected EntityManager entityManager; 
    ... 
    public DAO() { 
     entityManager = App.getEntityManager(); 
     ... 
    } 

    ... 
} 

Ho provato a cercare ulteriori informazioni circa l'origine di questa JtaPlatformInaccessibleException, ma non ho trovato nulla. Non sono sicuro di cosa manca.

+0

Im usando Hibernate 5.0.1.Final e PostgreSQL conducente 9,2-1.002-jdbc4 – zenilt

risposta

5

ok ... questo era solo un errore della configurazione XML unità persistenza, ho rimosso transaction-type = "JTA" dal tag di persistenza-unità. Sembra che sia stato aggiunto automaticamente dall'IDE.

0

Aggiungi @Transactional al tuo DAO e alla classe che accede alla tua classe DAO.

consultare: http://spring.io/guides/gs/managing-transactions/

+0

non sto usando primavera ... un semplice HttpServlet. Ho provato ad aggiungere @Transactional e non ho fatto nulla .. – zenilt

+0

@Transactional fa parte di JPA javax.transaction.Transactional – K139

+0

Yeap lo so ... L'ho aggiunto .. e non ho fatto nulla. – zenilt

10

basta aggiungere la proprietà alla persistence.xml

<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform"/> 
+0

Questa è stata la soluzione che ha funzionato per me. La soluzione del poster originale non ha funzionato nel mio caso. Utilizzando Hibernate 5.0.7 su wildfly 10.0.0.Final, avevo bisogno le seguenti righe nel mio persistence.xml: ... BRasmussen