Wildfly10 部署EJB连接Oracle

版权声明:本文为博主原创文章,非商用转载请注明出处: https://blog.csdn.net/qq_17058993/article/details/83272615

前面的文章 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();
	}
}

六、结果

猜你喜欢

转载自blog.csdn.net/qq_17058993/article/details/83272615