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();
}
}