[英]IBM Websphere JPA configuration - how to update persistence.xml
我是EJB 3和JPA的新手。
我已經在appserver中創建了一個數據源,它是jdbc/AppDataSource
。 缺省的持久性提供程序保留為com.ibm.websphere.persistence.PersistenceProviderImpl
。 我將默認的jta數據源JNDI名稱AppDataSource
為AppDataSource
本身。 對於JTA和非JTA,我實際上感到困惑。 他們有什么區別?
我在Bean中生成了實體並創建了EntityTransaction
對象。 在調用persist()
和commit()
方法時,出現錯誤:
javax.ejb.EJBException: See nested exception; nested exception is: <openjpa-1.2.1-SNAPSHOT-r422266:686069 fatal user error> org.apache.openjpa.persistence.ArgumentException: A JDBC Driver or DataSource class name must be specified in the ConnectionDriverName property.
Caused by: <openjpa-1.2.1-SNAPSHOT-r422266:686069 fatal user error> org.apache.openjpa.persistence.ArgumentException: A JDBC Driver or DataSource class name must be specified in the ConnectionDriverName property.
openjpa如何在這里出現?
到目前為止,我的persistence.xml
僅包含實體類名稱。
如何使它使用默認的appserver值作為數據源。 否則,如何在persistence.xml
提供jpa provider的詳細信息和數據源的詳細信息?
請提供您的輸入。
這個問題實際上涉及許多概念,我不會詳細介紹它們。 有關更詳盡的詳細信息,我建議閱讀JPA 1.0規范的整個第5章-實體管理器和持久性上下文 (以及此答案末尾提到的其他相關部分)。 我寧願嘗試描述Java EE環境中最常見的情況。
在EJB環境中,通常會使用:
這里是如何persistence.xml
為使用數據源與JNDI名稱的JTA實體管理器java:comp/env/jdbc/AppDataSource
可以設置,OpenJPA的是由WebSphere使用的持久性提供:
<?xml version="1.0" encoding="UTF-8"?>
<persistence 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_1_0.xsd"
version="1.0">
<persistence-unit name="MyPu" transaction-type="JTA">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<jta-data-source>java:comp/env/jdbc/AppDataSource</jta-data-source>
<class>com.acme.domain.Foo</class>
<class>com.acme.domain.Bar</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<!-- OpenJPA specific properties -->
<property name="openjpa.TransactionMode" value="managed"/>
<property name="openjpa.ConnectionFactoryMode" value="managed"/>
<property name="openjpa.jdbc.DBDictionary" value="db2"/>
</properties>
</persistence-unit>
</persistence>
有關OpenJPA屬性,請參考OpenJPA 文檔 。
這是SLSB(使用容器管理的事務)如何獲取注入容器管理的實體管理器的方法:
@Stateless
public class EmployeeServiceBean implements EmployeeService {
@PersistenceContext(unitName="MyPu")
private EntityManager em;
public Employee createEmployee(int id, String name, long salary) {
Employee emp = new Employee(id);
emp.setName(name);
emp.setSalary(salary);
em.persist(emp);
return emp;
}
...
}
就這樣。 實體管理器的生命周期由容器為應用程序透明管理(沒有createEM / close),並且實體管理器參與由容器管理的JTA事務(沒有明確的開始/提交)。
如前所述,我只是在摸索,我的目標是以某種方式使您走上正確的道路。 為了進一步講解,我建議您拿一本書(例如EJB3 in Action)。 同時,以下參考將是一個不錯的閱讀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.