因为之前JPA原生 <property>
属性在Wildfly实现中并不总是生效,所以这里换成了Wildfly默认的JPA实现,即Hibernate。把属性改成了Hibernate专有的。hibernate.hbm2ddl.auto
定义是否自动生成表,create-and-drop
意为如果表存在,则删除后再创建。hibernate.dialect
用来指定数据库厂商,以根据不同的数据库生成厂商相关的SQL语句。
创建EJB模块
=======
EJB Service client 模块
EJB可以用接口来定义此Bean是本地还是远程的。本地bean只能在部署应用的同一容器中访问,而远程bean可以被集群中的服务器所访问。
现在,创建一个maven模块,名为 notebookServiceClient。
pom.xml
文件内容为:
<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模块.
创建名为 IUserService
的接口,并写入如下代码:
public interface IUserService {
User getUserById(Long id);
List getAllUsers();
Long addUser(User user);
void deleteUser(User user);
}
这些方法定义了数据库CRUD操作,根据用户ID查询用户,查询所有用户,添加一个用户,删除一个用户。
再创建另一个名为 IUserServiceLocal
的接口,继承自 IUserService
, 并添加 @Local
注解,表明它为本地bean接口。
@Local
public interface IUserServiceLocal extends IUserService {
}
创建一个远程bean接口, IUserServiceRemote
:
@Remote
public interface IUserServiceRemote extends IUserService {
}
这两个接口都使用父接口的方法,所以类体留空即可。
EJB Service 模块
创建Maven模块 notebookService。 此模块是 notebookServiceClient 的具体实现。 pom.xml
文件内容为:
<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
文件内容,其实只是一个空的定义文件:
<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”>
在此模块下创建名为 UserServiceBean
的Java类,实现 IUserServiceLocal
接口并添加 @Stateful
注解。@Stataful
意思为此EJB在客户端与其交互中,保存所有状态。另一种EJB类型为@Stateless
,即在每次客户端请求时,从bean池里取出一个新的bean,状态不会保存。此类使用 @PersistenceContext
注解注入了一个EntityManager
对象,注入即是让容器管理此对象的创建与销毁。@PostConstruct
是生命周期注解,意思是在对象创建之后调用此方法,即 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调用EJB服务
==========
现在可以使用JSF来调用EJB服务了。在之前的 notebook 模块中,创建一个名为 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表达式。
-
IUserServiceLocal
使用@EJB
注解,不但声明了它是EJB组件,而且它的生命周期由容器管理,所以不用手动初始化它。 -
users
成员变量保存从数据库查询出来的所有User
对象。 -
user
即 notebookDomain 模块中的User
实体,用来接收用户从页面中输入的数据。 -
register()
方法保存用户数据到数据库中,并调用getAllUsers()
方法跳转到user_list
页面来显示所有用户的用户名。 -
getAllUsers()
用来查询所有用户,并跳转到user_list
页面来显示所有用户的用户名。
再创建一些JSF页面。首先创建 register.xhtml 页面,位于 WebContent 目录下:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)
笔者福利
以下是小编自己针对马上即将到来的金九银十准备的一套“面试宝典”,不管是技术还是HR的问题都有针对性的回答。
有了这个,面试踩雷?不存在的!
回馈粉丝,诚意满满!!!
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**
如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)
笔者福利
以下是小编自己针对马上即将到来的金九银十准备的一套“面试宝典”,不管是技术还是HR的问题都有针对性的回答。
有了这个,面试踩雷?不存在的!
回馈粉丝,诚意满满!!!
[外链图片转存中…(img-8cm0dVYD-1711622225398)]
[外链图片转存中…(img-SSTqMUhf-1711622225398)]
[外链图片转存中…(img-qShcInRd-1711622225398)]
[外链图片转存中…(img-Wqm8pcms-1711622225399)]文章来源:https://www.toymoban.com/news/detail-849463.html
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!文章来源地址https://www.toymoban.com/news/detail-849463.html
到了这里,关于Java EE开发系列教程 - 使用EJB组件与JPA层交互的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!