2012-05-10 54 views
1

我是一個java初學者。我很難用JTA事務來配置一個持久性單元。 我需要使用已經定義,配置和填充的PostgreSQL數據庫。使用NetBeans,我創建了persistance.xmlglassfish-resources.xml爲休耕:EntityManagerFactory沒有被注入使用@PersistenceUnit

<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="WellWatcherPU" transaction-type="JTA"> 
     <jta-data-source>WellWatcherDB</jta-data-source> 
     <exclude-unlisted-classes>false</exclude-unlisted-classes> 
     <properties> 
      <property name="eclipselink.logging.logger" value="org.eclipse.persistence.logging.DefaultSessionLog"/> 
      <property name="eclipselink.logging.level" value="FINE"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

<resources> 
    <jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="org.postgresql.ds.PGSimpleDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="post-gre-sql_geowellex_geowellexPool" non-transactional-connections="false" pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false"> 
     <property name="serverName" value="localhost"/> 
     <property name="portNumber" value="5432"/> 
     <property name="databaseName" value="DBNAME"/> 
     <property name="User" value="USER"/> 
     <property name="Password" value="PASSWORD"/> 
     <property name="URL" value="jdbc:postgresql://localhost:5432/DBNAME"/> 
     <property name="driverClass" value="org.postgresql.Driver"/> 
    </jdbc-connection-pool> 
    <jdbc-resource enabled="true" jndi-name="WellWatcherDB" object-type="user" pool-name="post-gre-sql_geowellex_geowellexPool"/> 
</resources> 

而且這是我得到的EntityManagerFactory和EntityManager的(如在NetBeans的例子中)

public class EUserDao { 

@Resource 
private UserTransaction utx = null; 
@PersistenceUnit(unitName = "WellWatcherPU") 
private EntityManagerFactory emf = null; 

public EntityManager getEntityManager() { 
    return emf.createEntityManager(); <-------- NullPointerException here 
} 

public EUser getOne(long userId){ 
    EntityManager em = getEntityManager(); 
    try { 
     return em.find(EUser.class, userId); 
    } finally { 
     em.close(); 
    } 
} 

編輯:

這裏是我的格拉斯sfish部署日誌:

信息:[EL Config]:2012-05-10 12:01:13.534 - ServerSession(2017352940) - 連接(1901223982) - 線程(線程[admin-thread-pool-4848 (5),如圖5所示,篦條篩內核]) - 連接(DatabaseLogin( 平臺=> DatabasePlatform 用戶名=> 「」 連接器=> JNDIConnector數據源名稱=>空 ))

Informações:[EL配置]:2012-05-10 12:01:13.534 - ServerSession(2017352940) - 連接(1462281761) - 線程(線程[admin-thread-pool-4848(5),5,grizzly-kernel]) - -Connected:jdbc:postgresql:// localhost:5432/geowellex?loginTimeout = 0 & prepareThreshold = 0 User:g eowellex 數據庫:PostgreSQL的版本:9.1.3 驅動:PostgreSQL的本機驅動程序版本:8.3的PostgreSQL與JDBC3 SSL(建立603)

Informações:[EL配置]:2012-05-10 12:01:13.534-- ServerSession(2017352940) - 連接(766700859) - 線程(線程[admin-thread-pool-4848(5),5,grizzly-kernel]) - 連接(DatabaseLogin( platform => PostgreSQLPlatform user name => 「」 connector => JNDIConnector datasource name => null ))

怎麼了?

+0

請從您的Web服務器日誌中發佈任何與實體管理器工廠初始化相關的條目。 – Perception

+0

剛編輯。感謝您的幫助。 –

回答

3

最有可能的問題是你的EUserDao只是普通班。注入僅適用於容器管理的類。像@PersistenceUnit和@Resource這樣的註釋不能用於普通類。

以下類型的類是容器管理類(和在那些@PersistenceUnit可以使用):

  • 的Servlet:小服務程序,servlet過濾,事件偵聽器
  • JSP:標記處理程序,標記庫事件偵聽
  • JSF:作用域管理豆
  • JAX-WS:服務端點,處理程序
  • EJB:豆類,攔截
  • 個託管Bean:管理豆
  • CDI:CDI式管理的bean,裝飾
  • 的Java EE平臺:主類(靜態),登錄回調處理
+0

現在你提到了,我注意到教程將Dao定義爲SessionBean。我會盡快檢查併發布結果 –

+0

謝謝。我沒有看到Dao必須是ManagedBean。 –

+0

此列表在哪裏記錄? –

1

我看到在你的代碼聲明:

private EntityManagerFactory emf = null; 

,但從來沒有建立一個......類似這樣的

emf = Persistence.createEntityManagerFactory("WellWatcherPU"); 

這就是爲什麼你會得到一個空指針使用對象時出現異常!

public EntityManager getEntityManager() { 
    return emf.createEntityManager(); <-------- NullPointerException here 
} 
相關問題