Wildfly10 部署EJB连接Oracle
前面的文章 WildFly10 配置连接Oracle数据库 已经成功在wildfly服务器上配置了Oracle的JNDI数据源。接下来在EJB工程中实现数据源的连接,实现操作Oracle数据库。
参考学习博客:JBoss7部署EJB连接MySQL
一、修改JPA子系统
打开 \wildfly-10.1.0.Final\standalone\configuration 中的 standalone.xml 找到
数据源为自己之前创建的,对应起来。 (加不加暂时没发现有什么区别,先记录原因后续添加)
二、添加persistence.xml文件
在工程的META-INF目录下加入persistence.xml文件,该文件会参考使用的datasource来匹配实体与数据库,代码如下:(并注意将工程打包成jar时添加该文件,为了往wildfly上部署)
EntityManagerFactory:它创建工厂类是通过JPA PersistenceProvider 类的自动检测机制(根据JPA的 Java SE启动),它会自动扫描META-INF/persistence.xml文件persistenceunit名称
<?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">
<!-- Name属性用于定义持久化单元的名字 (name必选,空值也合法) -->
<persistence-unit name="Data" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<!-- Jta-data-source 用于指定持久化提供商使用的JTA数据源的全局JNDI名称(可选) -->
<jta-data-source>java:jboss/datasources/MyOracleDS</jta-data-source>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect" />
</properties>
</persistence-unit>
</persistence>
注意:
1、数据源 必须统一
2、Hibernate的方言和底层数据库统一起来
后续参数配置再添加和学习
三、Bean实体
(注意不要自动生成serial version ID,否则会报错)
这里简单写了两个参数为了测试,实体类的作用主要是为了HQL查询对象使用。
package com.micmiu.ejb;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity // 表明这是一个实体Bean
@Table(name = "USERINFO") // 和数据库表USERINFO 建立映射
public class Data implements Serializable {
@Id // 表明是该实体的id
@Column(name = "ID")
private Integer ID;
@Column(name = "XFRXM")
private String XFRXM;
public Integer getID() {
return ID;
}
public void setID(Integer iD) {
ID = iD;
}
public String getXFRXM() {
return XFRXM;
}
public void setXFRXM(String xFRXM) {
XFRXM = xFRXM;
}
}
四、实现类
1、@PersistenceContext(unitName = "Data") 对应 persistence.xml文件中的 persistence-unit name属性
2、查询语句是HQL面向对象的,而不是SQL面向数据库查询,查询语句不同,需要学习Hibernate的HQL
3、查询语句必须是按照HQL查询规则来写,否则会报错:
org.hibernate.hql.internal.ast.QuerySyntaxException
// ejb 连接数据库
@PersistenceContext(unitName = "Data")
private EntityManager entityManager;
@Override
public void connectOracle() {
System.out.println("查询开始...");
java.util.List<Data> list = entityManager.createQuery("FROM Data as d where d.XFRXM = '闫春花'").getResultList();
System.out.println("list.size:" + list.size());
if (list != null) {
for (int i = 0; i < list.size(); i++) {
int id = list.get(i).getID();
String name = list.get(i).getXFRXM();
System.out.println("id:" + id + "_name" + name);
}
}
System.out.println("查询完毕....");
}
五、客户端测试
前期摸索的时候是在EJB工程中直接用JDBC添加驱动包进行数据库的连接,虽然在工程中加上了jar包
但是一直报错,
java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver from [Module "deployment.EJB-HelloWorld.jar:main" from Service Module Loader]
很明显deployment文件夹中肯本没把jar包引进来。
后来经过学习发现EJB在wildfly上打包部署的时候,如果引用了第三方jar包,需要连同jar打包一起部署到服务器,最麻烦的一点是需要添加配置文件对jar进行引用,过程相当麻烦,估计配置也不会蠢到这一步。后来想起在wildfly中已经配置好数据源了,直接调用就可以。
package com.ews.ejb;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import com.micmiu.ejb.HelloWorldRemote;
public class HelloWorldTest {
public static void main(String[] args) throws NamingException {
System.out.println("---------");
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
props.put(Context.PROVIDER_URL, "http-remoting://localhost:8081");
props.put("jboss.naming.client.ejb.context", true);
System.out.println("=========");
InitialContext context = new InitialContext(props);
//JNDI路径 查看控制台输出文件 @remote 注解的
String fullEJBName = "EJB-HelloWorld/HelloWorld!com.micmiu.ejb.HelloWorldRemote";
HelloWorldRemote helloWorld = (HelloWorldRemote) context.lookup(fullEJBName);
System.out.println("客户端请求完成!");
// helloWorld.testOracle(); //没有驱动包 会报错
helloWorld.connectOracle();
}
}
六、结果