1. 程式人生 > >Wildfly10 部署EJB連線Oracle

Wildfly10 部署EJB連線Oracle

前面的文章 WildFly10 配置連線Oracle資料庫 已經成功在wildfly伺服器上配置了Oracle的JNDI資料來源。接下來在EJB工程中實現資料來源的連線,實現操作Oracle資料庫。

 一、修改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

// 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但是一直報錯,雖然沒找到原因,後來學習發現EJB在wildfly上打包部署的時候,如果引用第三方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();
	}
}

六、結果