1. 程式人生 > >JPA + Tomcat + JNDI資料來源持久化配置

JPA + Tomcat + JNDI資料來源持久化配置

JPA2.1(EclipseLink 2.5.2) + Tomcat 8.0 + Java 8

一直想在Tomcat環境下配置JPA持久化框架, 配置的過程中遇到了一些問題. 總的來講是自己基礎不夠紮實,如果對JAVA EE技術框架足夠深入的話, 看到報錯資訊一般就能定位問題了, 對於新手來說可能有很長的一段路要走. 為了便於之後的工作,也順便和大家分享下自己的經歷少走一些彎路.

這是EclipseLink的官方配置

參照裡面的步驟基本可以實現JPA的配置, 但是總體感覺裡面有冗餘的配置, 其實並不需要(或許是我理解沒到位, 等以後熟悉了再補充)

以下是我覺得官方文件裡可以改動的地方

1. JNDI配置

1.1 configure a new global resource in conf/server.xml

1.2 configure a datasource context for the WAR in conf/server.xml

其實只需要把Resource內容加入conf/context.xml, 其它步驟暫時可以忽略不計, 配置完成後可以用JSP頁面測試JNDI

2. 專案中關聯JNDI和JPA 持久化單元

2.1. persistence-context-ref in web.xml

目前在實際測試中發現並不是必須的

2.2 resource-ref in web.xml

<resource-ref>
<description>DB Connection</description> <res-ref-name>JNDI_NAME</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>

如果在JSP頁面中用sql語句訪問, 直接訪問JND即可, 在java程式碼中必須要在web.xml做關聯或者加入@Resource(name="JNDI")註解 3. JPA配置檔案Persistence.xml配置
3.1 如果JDBC直連, 不使用JNDI可以忽略以上1, 2步驟,  <jta-data-source>屬性可以不用配置(不是很建議, 這樣每個工程都需要配置資料來源).
<property name="javax.persistence.jdbc.driver" value="oracle.jdbc.driver.OracleDriver"/>
        <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>
        <property name="javax.persistence.jdbc.user" value="ttocs"/>
        <property name="javax.persistence.jdbc.password" value="password"/>
 
3.2 配置JNDI資料來源 標準JNDI CONTEXT是:java;/comp/env
java;/comp/env/JNDI_NAME <non-jta-data-source>java:comp/env/playDS</non-jta-data-source> 根據以上步驟可以實現JPA EntityManager訪問Persistence.xml中配置的Persistent Unit  配置例項: 1. conf/context.xml <Resource name="playDS" auth="Container" type="javax.sql.DataSource"
maxTotal="100" maxIdle="30" maxWaitMillis="10000" username="root"
password="Aa12345" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/play" />
2. JPA配置檔案Persistence.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="playPU" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<non-jta-data-source>java:comp/env/playDS</non-jta-data-source>
<!-- 類似Galssfish等支援EJB的容器, 通過persistentContext等註解可以直接使用JNDI資料來源 -->
<!-- <non-jta-data-source>playDS</non-jta-data-source> -->
<class>play.entities.BasicUser</class>
</persistence-unit>
</persistence>
3. JavaBean程式碼 @Resource(name="playDS")  // 或者在web.xml中配置JNDI資料來源關聯, 參照上面2.2段落
public void saveBasicUser() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("playPU");
EntityManager manager = factory.createEntityManager();
EntityTransaction tran = manager.getTransaction();
tran.begin();
BasicUser ower = new BasicUser();
ower.setPassword("exigen");
ower.setUserName("wpeng_8g");
manager.persist(ower);
tran.commit();
}