2014-01-27 104 views
0

我在IntelliJ中創建了一個「Java EE Web模塊」項目。然後我寫了一個接受JSON輸入的JaxRS註釋類。然後,我用數據填充帶註釋的實體,並嘗試使用託管的持久性上下文來保存它。TomEE + OpenJPA + IntelliJ實體不會持久

​​

我有內的IntelliJ配置的數據源叫做「testdb的」,和持久性單元命名映射到在持久工具窗口該數據源「testunit」。

我的堅持XML看起來是這樣的:

<persistence-unit name="testunit"> 
     <jta-data-source>testdb</jta-data-source> 
     <class>datamodels.testdb.CustomerSessions</class> 
     <properties> 
      <property name="openjpa.ConnectionURL" value="jdbc:mysql://localhost:3306/testdb"/> 
      <property name="openjpa.ConnectionDriverName" value="com.mysql.jdbc.Driver"/> 
      <property name="openjpa.ConnectionUserName" value="testuser"/> 
      <property name="openjpa.ConnectionPassword" value="testpassword"/> 
      <property name="openjpa.Log" value="DefaultLevel=WARN, Runtime=INFO, Tool=INFO, SQL=TRACE"/> 
      <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

一切構建並部署得很好,沒有任何警告。請求也運行良好,並返回預期的響應,並生成新的客戶會話標識。

但是,數據庫中沒有任何內容出現。

所以,我的問題是:數據在哪裏發生,我怎樣才能使持久性和刷新調用對我的數據庫起作用?編輯: 我已經嘗試了更多的東西。

1)它看起來像TomEE正在使用某種內存HSQL數據庫,其數據源名稱爲「Default JDBC Data Source」。 2)當我手動創建實體管理器工廠,然後在實體管理器,一切正常:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("testunit"); 
    EntityManager em = emf.createEntityManager(); 

    try { 
     em.getTransaction().begin(); 

     CustomerSessions cs = new CustomerSessions(req.session_data); 
     em.persist(cs); 
     em.flush(); 
     em.getTransaction().commit(); 
     System.out.println("New CustomerSession saved: " + cs.getCustomerSessionId()); 
     return Response.ok(cs).build(); 
    } catch (Exception ex) { 
     em.getTransaction().rollback(); 
     return Response.serverError().entity("An exception occurred").build(); 
    } 

2)如果我嘗試使用@PersistenceUnit註釋創建EntityManagerFactory,出現相同的初始問題。

+0

當你返回響應時,你的瀏覽器可以看到'response ok'狀態碼?你的'交易管理器'配置是否正確?我懷疑它是在交易中失敗的地方。 –

+0

@ Rp-是的,我正在使用Chrome中的Postman進行測試,並且返回的響應非常好,ID字段中填充了新的ID。坦率地說,看起來有一個神奇的無形數據庫被保存到我無法找到的地方。 我沒有寫任何有關TransactionManagers的,因爲我使用託管的持久性上下文。 – jzila

+0

此外,如果這有幫助,當我停止服務器時,我得到這些信息消息:「2014年1月27日上午10時02分39秒org.apache.openejb.assembler.classic。彙編程序destroyResource 信息:關閉數據源:默認JDBC數據庫 2014年1月27日上午10時02分39秒org.apache.openejb.assembler.classic.Assembler destroyResource INFO:關閉數據源:默認非託管JDBC數據庫 J「.I' d期望這是我的數據源 – jzila

回答

1

有兩件事情我失蹤:

  1. 我沒有指定在tomee.xml <Resource>對象(我沒有 想,因爲我希望它與應用程序部署)。我發現 這可以在WEB-INFMETA-INF目錄中的resources.xml文件中完成。
  2. 我沒有在TomEE lib目錄下的 MySQL驅動程序jar。不幸的是,TomEE透明地加載了默認的JDBC驅動程序,導致實體在其自己神奇的數據庫中持續存在。

我仍然沒有解釋爲什麼應用程序管理(手動創建)的持久化上下文起作用,但至少現在我一直工作。