【问题标题】:Can not creat tables from entities. JTA and Glassfish无法从实体创建表。 JPA 和 Glassfish
【发布时间】:2012-12-29 17:00:53
【问题描述】:

我有一个关于 Glassfish 的 JTA 的问题。几天来,我试图解决这个问题。我想在数据库中编写一个实体。为了简单起见,我使用 GlassfishDB。在 Glassfish-Admin 控制台中,我使用

jdbc/__default

作为资源。连接池的 Ping 工作正常。在persistence.xml 中,我声明我正在使用JTA,并且jdbc/__ 默认是我的资源。如果我尝试从字段创建表,则会收到异常:

[EL Info]: EclipseLink, version: Eclipse Persistence Services - 2.0.1.v20100213-r6600
java.lang.NullPointerException
at `enter code here`com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:297)
at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:271)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:430)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:569)
at javax.naming.InitialContext.lookup(InitialContext.java:415)
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:110)
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:94)
at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:584)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:228)
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:369)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:151)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:207)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:195)
at org.eclipse.jpt.jpa.eclipselink.core.ddlgen.Main.perform(Main.java:85)
at org.eclipse.jpt.jpa.eclipselink.core.ddlgen.Main.execute(Main.java:76)
at org.eclipse.jpt.jpa.eclipselink.core.ddlgen.Main.main(Main.java:63)
[EL Severe]: Local Exception Stack: 
Exception [EclipseLink-7060] (Eclipse Persistence Services - 2.0.1.v20100213-r6600):           
org.eclipse.persistence.exceptions.ValidationException
Exception Description: Cannot acquire data source [jdbc/__default].
Internal Exception: javax.naming.NamingException: Lookup failed for 'jdbc/__default' in   
SerialContext  [Root exception is javax.naming.NamingException: Unable to acquire   
SerialContextProvider for SerialContext  [Root exception is   
java.lang.NullPointerException]]
at org.eclipse.persistence.exceptions.ValidationException.cannotAcquireDataSource(ValidationException.java:451)
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:116)
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:94)
at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:584)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:228)
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:369)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:151)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:207)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:195)
at org.eclipse.jpt.jpa.eclipselink.core.ddlgen.Main.perform(Main.java:85)
at org.eclipse.jpt.jpa.eclipselink.core.ddlgen.Main.execute(Main.java:76)
at org.eclipse.jpt.jpa.eclipselink.core.ddlgen.Main.main(Main.java:63)
 Caused by: javax.naming.NamingException: Lookup failed for 'jdbc/__default' in    
 SerialContext  [Root exception is javax.naming.NamingException: Unable to acquire      
 SerialContextProvider for SerialContext  [Root exception is  
 java.lang.NullPointerException]]

persistence.xml 是:

 <?xml version="1.0" encoding="UTF-8"?>
   <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"   
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence   
    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
 <persistence-unit name="Test" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>jdbc/__default</jta-data-source>
 </persistence-unit>
   </persistence>

Glassfish 的 domain.xml 的&lt;resources&gt;-部分是:

-<resources> 
  <jdbc-resource object-type="system-admin" jndi-name="jdbc/__TimerPool" pool-  
  name="__TimerPool"/> 
  <jdbc-resource jndi-name="jdbc/__default" pool-name="DerbyPool"/> 
 -<jdbc-connection-pool name="__TimerPool" res-type="javax.sql.XADataSource"  
   datasource-classname="org.apache.derby.jdbc.EmbeddedXADataSource"> 
  <property name="databaseName"   
   value="${com.sun.aas.instanceRoot}/lib/databases/ejbtimer"/> 
  <property name="connectionAttributes" value=";create=true"/> 
  </jdbc-connection-pool>  
  -<jdbc-connection-pool name="DerbyPool" res-type="javax.sql.DataSource" datasource- 
   classname="org.apache.derby.jdbc.ClientDataSource" is-isolation-level-
   guaranteed="false"> <property name="PortNumber" value="1527"/> 
   <property name="Password" value="APP"/> 
   <property name="User" value="APP"/> <property name="serverName" value="localhost"/>  
   <property name="DatabaseName" value="sun-appserv-samples"/> 
   <property name="connectionAttributes" value=";create=true"/> 
   </jdbc-connection-pool> 
   -<jdbc-connection-pool name="PostSQLPool" res-type="javax.sql.DataSource"  
    datasource-classname="org.postgresql.ds.PGSimpleDataSource" ping="true"> 
   <property name="databaseName" value="PostSQLDatenbank"/> 
   <property name="password" value="philipp"/> <property name="portNumber" 
   value="5432"/> 
   <property name="serverName" value="localhost"/> 
   <property name="user" value="postgres"/> 
   <property name="URL" value="URL=jdbc:postgresql://localhost:5432/Time"/> 
   </jdbc-connection-pool> -
   <jdbc-connection-pool name="PostPool" res-
   type="javax.sql.DataSource" datasource- 
   classname="org.postgresql.ds.PGSimpleDataSource" ping="true"> 
   <property name="Url" value="jdbc:postgresql://localhost:5432/PostSQLDatenbank"/> 
   <property name="URL" value="jdbc:postgresql://localhost:5432/PostSQLDatenbank"/>  
   <property name="databaseName" value="PostSQLDatenbank"/> 
   <property name="password" value="philipp"/> 
   <property name="portNumber" value="5432"/> 
   <property name="serverName" value="localhost"/> 
   <property name="user" value="postgres"/> 
   </jdbc-connection-pool> 
 </resources>

【问题讨论】:

  • 可能是一个编辑问题,但persistence.xml 显示两个_“__default”,而您提到您将“dbc/_default”定义为资源。它们必须匹配,否则找不到
  • 嗨,一个下划线而不是两个是在文本区域中显示它的问题。我更改了文本以使其清楚。我没有更改 jdbc/__default 上的任何内容,GlassfishDB 已连接,DB 的类路径已设置。
  • jdbc/__default是连接池名还是JDBC资源之一?一定是后者
  • 能否附上domain.xml glassfish 配置文件的&lt;resources&gt; 部分?
  • 我添加了 domain.xml 的 部分。 jdbc/__default 是 JDBC 资源名称。

标签: jpa glassfish eclipselink jta


【解决方案1】:

从您的堆栈跟踪来看,您似乎在 Glassfish 之外运行,要使用 Glassfish 数据源,您需要在服务器内部运行。

如果你想在 Glassfish 之外运行,你需要直接指定 JDBC 连接 URL。

看, http://en.wikibooks.org/wiki/Java_Persistence/Runtime#Java_Standard_Edition

【讨论】:

  • 您好,感谢您的评论。你是对的,我在 ManagedBean 中混合了一些东西。我使用了 EntityManagerFactory 和 EntityManager,而 EntityManager 没有正确注释。我删除了 EntityMFactory,但它仍然无法正常工作。为了确保,我没有忘记我所做的步骤: 1. ManagedBean 与 EntityManager 和 UserTranscaction。 2. Entity-Class 3. 启动 DerbyDB 4. Glassfish-Admin 控制台中的 Ping 工作正常。 5. 在persistence.xml 中,我使用了JNDI-Resource jdbc/__default,并启用了JTA。我究竟做错了什么?我是不是忘记了什么?
猜你喜欢
  • 2022-01-17
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多