您的位置:首页 > 运维架构 > Tomcat

JPA + Tomcat + JNDI数据源持久化配置

2015-07-16 15:54 686 查看
JPA2.1(EclipseLink 2.5.2) + Tomcat 8.0 + Java 8

一直想在Tomcat环境下配置JPA持久化框架, 配置的过程中遇到了一些问题. 总的来讲是自己基础不够扎实,如果对JAVA EE技术框架足够深入的话, 看到报错信息一般就能定位问题了, 对于新手来说可能有很长的一段路要走. 为了便于之后的工作,也顺便和大家分享下自己的经历少走一些弯路.

这是EclipseLink的官方配置

http://wiki.eclipse.org/EclipseLink/Examples/JPA/Tomcat_Web_Tutorial

参照里面的步骤基本可以实现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

Tomcat官网配置:
MySQL配置连接举例

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.createEntityManagerFactor
b7a2
y("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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tomcat jpa JNDI Eclipse