2016-01-04 85 views
1

通過使用CDI如在下面的代碼:進樣冬眠PersistenceUnit

@PersistenceUnit 
EntityManagerFactory emf; 

我想注入我休眠EntityManagerFactory

目前,如果我執行下一行:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("HibernatePersistanceProv"); 

它按照預期工作,但如果我使用第一種方法嘗試使用Derby連接,我知道這是因爲我收到下一條錯誤消息:

org.hibernate.exception.GenericJDBCException: Unable to acquire JDBC Connection

通過堆棧跟蹤我知道它是由於這個原因造成的。

Error connecting to server localhost on port 1527 with message Connection refused.

我知道那是因爲它試圖連接到(Java DB的)德比分貝。

我persistance.xml看起來是這樣的:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> 
    <persistence-unit name="HibernatePersistanceProv" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <exclude-unlisted-classes>false</exclude-unlisted-classes> 
     <properties> 
      <property name="hibernate.connection.username" value="root"/> 
      <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/aschema"/> 
      <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> 
      <property name="hibernate.connection.username" value="root"/> 
      <property name="hibernate.connection.password" value=""/> 
      <property name="hibernate.show_sql" value="true"/> 
      <property name="hibernate.format_sql" value="false"/> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> 
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/aschema"/> 
      <property name="javax.persistence.jdbc.user" value="root"/> 
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

我讀,顯然我需要指定一個standalone.xml提供不同<jta-data-source>但它接縫我一點比它應該是什麼更復雜(我不想追逐錯誤的兔子),我已經從Java EE世界一段時間了,所以我認爲我的自我是全新的(對於假人解釋廣泛讚賞)。

(如果有幫助)我在GlassFish 4.1服務器上運行。請詢問是否需要其他信息。

+1

「*我正在閱讀,顯然我需要指定'standalone.xml'來提供不同的''。*」'standalone.xml'是一個JBoss/WildFly特定配置文件。 – Tiny

回答

0

該解決方案最終會被我不是管理得我的連接在Glassfish的池,以實現這種行爲(至少這是我發現的方式,但我敢肯定,他們應該更)您需要:

Glassfish的一面:

  1. 「常規任務」面板(管理員控制檯的左側(Glasfish4)擴大JDBC
  2. 選擇JDBC連接池並單擊主(中央)面板頂部的按鈕,繼續配置池的數據庫連接。
  3. 現在在同一JDBC節前面提到的(左圖)選擇JDBC資源(應立即上面JDBC連接池)那裏,你可以創建一個新的資源,這樣就可以使用使用CDI或者像我一樣,只需配置它在jdbc/__默認連接(如你可能想象的那樣,是Glassfish提供的默認連接CDI名稱空間,選擇你的連接池點擊鏈接jdbc/__默認上出現主表(中央)面板,這將帶您進入另一種形式,您可以使用標記爲的下拉列表池名稱:選擇您新配置的連接池,或者您選擇的一個;將它保存在主(中央)面板的左上角。

休眠方:

  1. persistence.xml,您可以: 一)確保你沒有提供任何<jta-data-source>IFF您在的jdbc/__默認配置) b)提供JNDI名稱(通常是您爲您提供的名稱JDBC資源(如果喲你創建了一個),或者在默認連接的情況下(jdbc/__ default),你可以在編輯視圖(它是:java:comp/DefaultDataSource)中看到JDNI名稱。 在你的persistence.xml中寫入<jta-data-source>,它應該有所斬斷。

對不起,由於缺乏圖形資源,我會盡量在稍後添加它們。我希望它適合你「匿名閱讀器」

重要注意事項我需要切換回Glassfish 4(不是4.1),因爲Glassfish 4.1當前(截至Jan`16)存在一個不允許您創建新連接池的錯誤。

0

我覺得你的問題是數據庫相關的,但注入的EntityManager我通常用這個去:

public class EntityManagerFactoryProducer { 

     @Produces 
     @ApplicationScoped 
     public EntityManagerFactory create() { 
      return Persistence.createEntityManagerFactory("HibernatePersistanceProv"); 
     } 

     public void destroy(@Disposes EntityManagerFactory factory) { 
      factory.close(); 
     } 

    } 

    public class EntityManagerProducer { 

     @Inject 
     private EntityManagerFactory emf; 

     @Produces 
     @RequestScoped 
     public EntityManager create() { 
      return emf.createEntityManager(); 
     } 

     public void destroy(@Disposes EntityManager em) { 
      em.close(); 
     } 
    } 

不僅僅是簡單地把它注射在任何你想要的。如果您有更多的數據庫使用限定符與注入相結合。

@Inject 
private EntityManager entityManager;