因為之前JPA原生 <property>
屬性在Wildfly實現(xiàn)中并不總是生效,所以這里換成了Wildfly默認(rèn)的JPA實現(xiàn),即Hibernate。把屬性改成了Hibernate專有的。hibernate.hbm2ddl.auto
定義是否自動生成表,create-and-drop
意為如果表存在,則刪除后再創(chuàng)建。hibernate.dialect
用來指定數(shù)據(jù)庫廠商,以根據(jù)不同的數(shù)據(jù)庫生成廠商相關(guān)的SQL語句。
創(chuàng)建EJB模塊
=======
EJB Service client 模塊
EJB可以用接口來定義此Bean是本地還是遠(yuǎn)程的。本地bean只能在部署應(yīng)用的同一容器中訪問,而遠(yuǎn)程bean可以被集群中的服務(wù)器所訪問。
現(xiàn)在,創(chuàng)建一個maven模塊,名為 notebookServiceClient。
pom.xml
文件內(nèi)容為:
<project xmlns=“http://maven.apache.org/POM/4.0.0”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>
notebookRoot
com.zxuqian
0.0.2
…/notebookRoot/pom.xml
4.0.0
notebookServiceClient
src
**/*.java
maven-compiler-plugin
com.zxuqian
notebookDomain
org.jboss.spec.javax.ejb
jboss-ejb-api_3.2_spec
provided
此模塊也繼承自 notebookRoot 模塊, 并且依賴于 notebookDomain 模塊和jboss ejb模塊.
創(chuàng)建名為 IUserService
的接口,并寫入如下代碼:
public interface IUserService {
User getUserById(Long id);
List getAllUsers();
Long addUser(User user);
void deleteUser(User user);
}
這些方法定義了數(shù)據(jù)庫CRUD操作,根據(jù)用戶ID查詢用戶,查詢所有用戶,添加一個用戶,刪除一個用戶。
再創(chuàng)建另一個名為 IUserServiceLocal
的接口,繼承自 IUserService
, 并添加 @Local
注解,表明它為本地bean接口。
@Local
public interface IUserServiceLocal extends IUserService {
}
創(chuàng)建一個遠(yuǎn)程bean接口, IUserServiceRemote
:
@Remote
public interface IUserServiceRemote extends IUserService {
}
這兩個接口都使用父接口的方法,所以類體留空即可。
EJB Service 模塊
創(chuàng)建Maven模塊 notebookService。 此模塊是 notebookServiceClient 的具體實現(xiàn)。 pom.xml
文件內(nèi)容為:
<project xmlns=“http://maven.apache.org/POM/4.0.0”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>
notebookRoot
com.zxuqian
0.0.2
…/notebookRoot/pom.xml
4.0.0
ejb
notebookService
src
**/*.java
maven-compiler-plugin
maven-ejb-plugin
org.jboss.spec.javax.ejb
jboss-ejb-api_3.2_spec
provided
org.hibernate.javax.persistence
hibernate-jpa-2.1-api
provided
com.zxuqian
notebookDomain
com.zxuqian
notebookServiceClient
這里的不同之處是 <packaging>
的值為 ejb, 意為此模塊將被打包成 EJB 格式。 如果EJB版本小于3.0,則需要在模塊的 src/META-INF 文件夾下添加 ejb-jar.xml
文件,如果EJB版本大于3.0,則可以省略。這里提供 ejb-jar.xml
文件內(nèi)容,其實只是一個空的定義文件:
<ejb-jar xmlns=“http://java.sun.com/xml/ns/javaee”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"
version=“3.1”>
在此模塊下創(chuàng)建名為 UserServiceBean
的Java類,實現(xiàn) IUserServiceLocal
接口并添加 @Stateful
注解。@Stataful
意思為此EJB在客戶端與其交互中,保存所有狀態(tài)。另一種EJB類型為@Stateless
,即在每次客戶端請求時,從bean池里取出一個新的bean,狀態(tài)不會保存。此類使用 @PersistenceContext
注解注入了一個EntityManager
對象,注入即是讓容器管理此對象的創(chuàng)建與銷毀。@PostConstruct
是生命周期注解,意思是在對象創(chuàng)建之后調(diào)用此方法,即 init()
方法,此方法初始化 UserDao
類,并傳遞 EntityManager
對象。
@Stateful
public class UserServiceBean implements IUserServiceLocal {
@PersistenceContext
private EntityManager entityManager;
private IUserDao userDao;
@PostConstruct
private void init() {
this.userDao = new UserDao(entityManager);
}
public User getUserById(Long id) {
return this.userDao.getUserById(id);
}
public List getAllUsers() {
return this.userDao.getAllUsers();
}
public Long addUser(User user) {
return this.userDao.addUser(user);
}
public void deleteUser(User user) {
this.userDao.deleteUser(user);
}
}
JSF調(diào)用EJB服務(wù)
==========
現(xiàn)在可以使用JSF來調(diào)用EJB服務(wù)了。在之前的 notebook 模塊中,創(chuàng)建一個名為 UserBackBean
的Java類:
public class UserBackBean implements Serializable {
private Logger logger = Logger.getLogger(UserBackBean.class.getCanonicalName());
@EJB
private IUserServiceLocal userService;
private List users;
private User user;
public UserBackBean() {
this.user = new User();
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public List getUsers() {
return users;
}
public void setUsers(User user) {
this.users.add(user);
}
public String register() {
this.userService.addUser(this.user);
return this.getAllUsers();
}
public String getAllUsers() {
this.users = this.userService.getAllUsers();
return “user_list”;
}
}
此類作為JSF頁面的后端bean,提供屬性和方法供頁面使用,利用EL表達(dá)式。
-
IUserServiceLocal
使用@EJB
注解,不但聲明了它是EJB組件,而且它的生命周期由容器管理,所以不用手動初始化它。 -
users
成員變量保存從數(shù)據(jù)庫查詢出來的所有User
對象。 -
user
即 notebookDomain 模塊中的User
實體,用來接收用戶從頁面中輸入的數(shù)據(jù)。 -
register()
方法保存用戶數(shù)據(jù)到數(shù)據(jù)庫中,并調(diào)用getAllUsers()
方法跳轉(zhuǎn)到user_list
頁面來顯示所有用戶的用戶名。 -
getAllUsers()
用來查詢所有用戶,并跳轉(zhuǎn)到user_list
頁面來顯示所有用戶的用戶名。
再創(chuàng)建一些JSF頁面。首先創(chuàng)建 register.xhtml 頁面,位于 WebContent 目錄下:
自我介紹一下,小編13年上海交大畢業(yè),曾經(jīng)在小公司待過,也去過華為、OPPO等大廠,18年進(jìn)入阿里一直到現(xiàn)在。
深知大多數(shù)Java工程師,想要提升技能,往往是自己摸索成長或者是報班學(xué)習(xí),但對于培訓(xùn)機構(gòu)動則幾千的學(xué)費,著實壓力不小。自己不成體系的自學(xué)效果低效又漫長,而且極易碰到天花板技術(shù)停滯不前!
因此收集整理了一份《2024年Java開發(fā)全套學(xué)習(xí)資料》,初衷也很簡單,就是希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友,同時減輕大家的負(fù)擔(dān)。
既有適合小白學(xué)習(xí)的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗的小伙伴深入學(xué)習(xí)提升的進(jìn)階課程,基本涵蓋了95%以上Java開發(fā)知識點,真正體系化!
由于文件比較大,這里只是將部分目錄截圖出來,每個節(jié)點里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實戰(zhàn)項目、講解視頻,并且會持續(xù)更新!
如果你覺得這些內(nèi)容對你有幫助,可以掃碼獲?。。。ㄙY料價值較高,非無償)

筆者福利
以下是小編自己針對馬上即將到來的金九銀十準(zhǔn)備的一套“面試寶典”,不管是技術(shù)還是HR的問題都有針對性的回答。
有了這個,面試踩雷?不存在的!
回饋粉絲,誠意滿滿?。?!
《一線大廠Java面試題解析+核心總結(jié)學(xué)習(xí)筆記+最新講解視頻+實戰(zhàn)項目源碼》,點擊傳送門即可獲??!
來,每個節(jié)點里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實戰(zhàn)項目、講解視頻,并且會持續(xù)更新!**
如果你覺得這些內(nèi)容對你有幫助,可以掃碼獲?。。。ㄙY料價值較高,非無償)

筆者福利
以下是小編自己針對馬上即將到來的金九銀十準(zhǔn)備的一套“面試寶典”,不管是技術(shù)還是HR的問題都有針對性的回答。
有了這個,面試踩雷?不存在的!
回饋粉絲,誠意滿滿?。?!
[外鏈圖片轉(zhuǎn)存中…(img-8cm0dVYD-1711622225398)]
[外鏈圖片轉(zhuǎn)存中…(img-SSTqMUhf-1711622225398)]
[外鏈圖片轉(zhuǎn)存中…(img-qShcInRd-1711622225398)]
[外鏈圖片轉(zhuǎn)存中…(img-Wqm8pcms-1711622225399)]文章來源:http://www.zghlxwxcb.cn/news/detail-849463.html
《一線大廠Java面試題解析+核心總結(jié)學(xué)習(xí)筆記+最新講解視頻+實戰(zhàn)項目源碼》,點擊傳送門即可獲??!文章來源地址http://www.zghlxwxcb.cn/news/detail-849463.html
到了這里,關(guān)于Java EE開發(fā)系列教程 - 使用EJB組件與JPA層交互的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!