无法与Hibernate建立实体管理器工厂时,作为持久性提供

问题描述:

我的persistence.xml查找JNDI名称:无法与Hibernate建立实体管理器工厂时,作为持久性提供

<persistence-unit name="manager1" transaction-type="RESOURCE_LOCAL"> 
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
<jta-data-source>java:comp/env/jdbc/mysql</jta-data-source> 
<exclude-unlisted-classes>false</exclude-unlisted-classes> 
<properties> 
    <property name="javax.persistence.schema-generation.database.action" value="create"/> 
</properties> 

我的课SmartphoneServices:

@Stateless 
@LocalBean 
public class SmartphoneService implements IDao<Smartphone> { 

    private static final String JPQL_SELECT_PAR_ID = "SELECT u FROM Smartphone u WHERE u.idSmartphone=:id"; 

    private EntityManagerFactory emf; 
    private EntityManager em; 

    public SmartphoneService() {   
     emf = Persistence.createEntityManagerFactory("manager1"); 
     em = emf.createEntityManager(); 
    } 
    @Override 
    public boolean create(Smartphone smart) { 
     try { 
      em.getTransaction().begin(); 
      em.persist(smart); 
      em.getTransaction().commit(); 
      return true; 

     } catch (Exception e) { 
      if (em.getTransaction() != null) { 
       em.getTransaction().rollback(); 
      } 
     } 
     return false; 
    }} 

我的servlet:

@EJB 
SmartphoneService ss; 
@Override 
protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    processRequest(request, response); 


    ss=new SmartphoneService(); 
    Smartphone smart=new Smartphone(000, 000, null, null, null); 
    ss.create(smart); 
} 

我创建了一个数据库,而不表+池连接(平成功)+ JNDI名称=的jdbc/mysql的

the project was successfully deployed 
当我跑我的servlet创建表和坚持我的目标

..我得到这个错误:

Infos: HCANN000001: Hibernate Commons Annotations {4.0.4.Final} 
Grave: Exception while invoking class org.glassfish.ejb.startup.EjbDeployer load method 
java.lang.RuntimeException: EJB Container initialization error 
    at org.glassfish.ejb.startup.EjbApplication.loadContainers(EjbApplication.java:234) 
    at org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:291) 
    at org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:99) 
    at org.glassfish.internal.data.ModuleInfo.load(ModuleInfo.java:206) 
    at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:313) 
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:496) 
    at com.sun.enterprise.v3.server.ApplicationLoaderService.processApplication(ApplicationLoaderService.java:406) 
    at com.sun.enterprise.v3.server.ApplicationLoaderService.postConstruct(ApplicationLoaderService.java:243) 
    at org.jvnet.hk2.internal.ClazzCreator.postConstructMe(ClazzCreator.java:329) 
    at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:377) 
    at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:461) 
    at org.glassfish.hk2.runlevel.internal.AsyncRunLevelContext.findOrCreate(AsyncRunLevelContext.java:227) 
    at org.glassfish.hk2.runlevel.RunLevelContext.findOrCreate(RunLevelContext.java:84) 
    at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2258) 
    at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:105) 
    at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:87) 
    at org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.oneJob(CurrentTaskFuture.java:1162) 
    at org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.run(CurrentTaskFuture.java:1147) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: javax.persistence.PersistenceException: Unable to build entity manager factory 
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:81) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54) 
    at com.fussa.service.SmartphoneService.<init>(SmartphoneService.java:38) 
    at com.fussa.service.__EJB31_Generated__SmartphoneService__Intf____Bean__.<init>(Unknown Source) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408) 
    at java.lang.Class.newInstance(Class.java:438) 
    at com.sun.ejb.containers.BaseContainer.instantiateOptionalEJBLocalBusinessObjectImpl(BaseContainer.java:3866) 
    at com.sun.ejb.containers.StatelessSessionContainer.initializeHome(StatelessSessionContainer.java:237) 
    at com.sun.ejb.containers.StatelessContainerFactory.createContainer(StatelessContainerFactory.java:63) 
    at org.glassfish.ejb.startup.EjbApplication.loadContainers(EjbApplication.java:221) 
    ... 20 more 
Caused by: org.hibernate.engine.jndi.JndiException: Unable to lookup JNDI name [java:comp/env/jdbc/mysql] 
    at org.hibernate.engine.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:117) 
    at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.configure(DatasourceConnectionProviderImpl.java:115) 
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:89) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:206) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:178) 
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess(JdbcServicesImpl.java:260) 
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:94) 
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:89) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:206) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:178) 
    at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1885) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1843) 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850) 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:843) 
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:399) 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:842) 
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:73) 
    ... 33 more 
Caused by: javax.naming.NamingException: Lookup failed for 'java:comp/env/jdbc/mysql' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NamingException: Invocation exception: Got null ComponentInvocation ] 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:491) 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:438) 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:622) 
    at javax.naming.InitialContext.lookup(InitialContext.java:421) 
    at javax.naming.InitialContext.lookup(InitialContext.java:421) 
    at org.hibernate.engine.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:114) 
    ... 49 more 
Caused by: javax.naming.NamingException: Invocation exception: Got null ComponentInvocation 
    at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.getComponentId(GlassfishNamingManagerImpl.java:842) 
    at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:714) 
    at com.sun.enterprise.naming.impl.JavaURLContext.lookup(JavaURLContext.java:159) 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:471) 
    ... 54 more 

Grave: Exception during lifecycle processing 
java.lang.RuntimeException: EJB Container initialization error 
    at org.glassfish.ejb.startup.EjbApplication.loadContainers(EjbApplication.java:234) 
    at org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:291) 
    at org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:99) 
    at org.glassfish.internal.data.ModuleInfo.load(ModuleInfo.java:206) 
    at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:313) 
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:496) 
    at com.sun.enterprise.v3.server.ApplicationLoaderService.processApplication(ApplicationLoaderService.java:406) 
    at com.sun.enterprise.v3.server.ApplicationLoaderService.postConstruct(ApplicationLoaderService.java:243) 
    at org.jvnet.hk2.internal.ClazzCreator.postConstructMe(ClazzCreator.java:329) 
    at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:377) 
    at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:461) 
    at org.glassfish.hk2.runlevel.internal.AsyncRunLevelContext.findOrCreate(AsyncRunLevelContext.java:227) 
    at org.glassfish.hk2.runlevel.RunLevelContext.findOrCreate(RunLevelContext.java:84) 
    at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2258) 
    at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:105) 
    at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:87) 
    at org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.oneJob(CurrentTaskFuture.java:1162) 
    at org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.run(CurrentTaskFuture.java:1147) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
+0

什么是'SmartphoneService.java:49'? – Kerry

+0

如果(em.getTransaction()!= NULL).. – FuSsA

您可以切换到JTA,并添加注释@PersistenceContext自动注入EntityManager

@PersistenceContext 
private EntityManager em; 

常你e persistence.xml看起来像这样:

<persistence-unit name="manager1" transaction-type="JTA"> 

如果你只有一个PersistenceUnit,你不需要在批注指定它。如果您有多个PersistenceUnits你可以指定一个使用这样的:

@PersistenceContext(unitName = "manager1") 
private EntityManager em; 

如果你使用JTA你不必自行管理的事务,所以一定要与em.getTransaction()除去一切。这是推荐的方法

另一种方法,如果你想使用RESOURCE_LOCAL,是使用EntityManagerFactory得到EntityManager的一个实例。

EntityManager em = Persistence.createEntityManagerFactory("manager1") 
.createEntityManager(); 

@PersistenceUnit(unitName = "manager1") 
private EntityManagerFactory emf; 

更新

对于这两种方法,你应该改变你的数据源是这样的:

<jta-data-source>jdbc/mysql</jta-data-source> 

如果你想使用RESOURCE_LOCAL你应该也将其更改为non-jta-data-source(但是在Glassfish中它也可以与jta-data-source一起使用)。

实施例:

<non-jta-data-source>jdbc/mysql</non-jta-data-source> 

参见:

+0

我也删除** ** – FuSsA