本文详细介绍EJB+JPA实现Entity的CRUD基本操作。
目录
- 创建POJO:BlogVo
- 创建Entity:Blog
- 配置persistence.xml
- 定义Remote接口
- 创建SessionBean实现类
- 配置datasource数据源
- 部署EJB工程
- 创建客户端测试类
- 运行测试类
[一]、创建POJO:BlogVo.java
1 | package com.micmiu.ejb.vo; |
3 | import java.io.Serializable; |
9 | * @time Create on 2013-9-25 下午3:02:17 |
12 | public class BlogVo implements Serializable { |
14 | private static final long serialVersionUID = -6384496304647072095L; |
22 | private String author; |
24 | public Integer getId() { |
28 | public String getTitle() { |
32 | public String getUrl() { |
36 | public String getAuthor() { |
40 | public void setId(Integer id) { |
44 | public void setTitle(String title) { |
48 | public void setUrl(String url) { |
52 | public void setAuthor(String author) { |
57 | public String toString() { |
58 | return "BlogVo [id=" + id + ", title=" + title + ", url=" + url |
59 | + ", author=" + author + "]" ; |
[二]、创建Entity:Blog.java
1 | package com.micmiu.ejb.entity; |
3 | import java.io.Serializable; |
5 | import javax.persistence.Column; |
6 | import javax.persistence.Entity; |
7 | import javax.persistence.GeneratedValue; |
8 | import javax.persistence.Id; |
9 | import javax.persistence.NamedQueries; |
10 | import javax.persistence.NamedQuery; |
11 | import javax.persistence.Table; |
17 | * @time Create on 2013-9-24 下午1:57:47 |
21 | @Table (name = "DEMO_T_BLOG" ) |
22 | @NamedQueries ({ @NamedQuery (name = "queryAll" , query = "select t from Blog t " ) }) |
23 | public class Blog implements Serializable { |
25 | private static final long serialVersionUID = -1371929956020543775L; |
32 | @Column (name = "TITLE" , length = 128 ) |
35 | @Column (name = "URL" , length = 1024 ) |
38 | @Column (name = "AUTHOR" , length = 20 ) |
39 | private String author; |
41 | public Integer getId() { |
45 | public String getTitle() { |
49 | public String getUrl() { |
53 | public String getAuthor() { |
57 | public void setId(Integer id) { |
61 | public void setTitle(String title) { |
65 | public void setUrl(String url) { |
69 | public void setAuthor(String author) { |
74 | public String toString() { |
75 | return "Blog [id=" + id + ", title=" + title + ", url=" + url |
76 | + ", author=" + author + "]" ; |
[三]、配置persistence.xml
修改配置文件 src: META-INF/persistence.xml
1 | <? xml version = "1.0" encoding = "UTF-8" ?> |
2 | < persistence version = "2.0" |
7 | < persistence-unit name = "micmiuJPA" transaction-type = "JTA" > |
8 | < provider >org.hibernate.ejb.HibernatePersistence</ provider > |
10 | < jta-data-source >java:/micmiuOracleDS</ jta-data-source > |
13 | < exclude-unlisted-classes >true</ exclude-unlisted-classes > |
15 | < property name = "hibernate.archive.autodetection" value = "class,hbm" /> |
17 | < property name = "hibernate.dialect" value = "org.hibernate.dialect.Oracle10gDialect" /> |
19 | < property name = "hibernate.hbm2ddl.auto" value = "update" /> |
21 | < property name = "hibernate.show_sql" value = "true" /> |
23 | < property name = "hibernate.format_sql" value = "true" /> |
ps:<jta-data-source></jta-data-source>配置的值“java:/micmiuOracleDS”需要和JBOSS_HOME/server/default/conf/tandardjbosscmp-jdbc.xml 中配置的<datasource></datasource>一致,详见 下面 第[六]部分 配置datasource数据源
[四]、定义Remote接口
BlogBeanRemote.java
1 | package com.micmiu.ejb; |
5 | import javax.ejb.Remote; |
7 | import com.micmiu.ejb.vo.BlogVo; |
13 | * @time Create on 2013-9-25 下午3:05:42 |
17 | public interface BlogBeanRemote { |
19 | BlogVo create(BlogVo blog); |
21 | BlogVo read(Integer id); |
23 | void update(BlogVo blog); |
25 | void delete(Integer id); |
27 | List<BlogVo> queryAll(); |
29 | List<BlogVo> queryByAuthor(String author); |
[五]、创建SessionBean实现类
BlogBean.java
1 | package com.micmiu.ejb; |
3 | import java.util.ArrayList; |
6 | import javax.ejb.Stateless; |
7 | import javax.persistence.EntityManager; |
8 | import javax.persistence.PersistenceContext; |
9 | import javax.persistence.Query; |
11 | import com.micmiu.ejb.entity.Blog; |
12 | import com.micmiu.ejb.vo.BlogVo; |
22 | public class BlogBean implements BlogBeanRemote { |
24 | @PersistenceContext(unitName = "micmiuJPA" ) |
25 | private EntityManager em; |
34 | public BlogVo create(BlogVo vo) { |
35 | Blog po = this .parseVo2Po(vo); |
38 | return this .parsePo2Vo(po); |
42 | public BlogVo read(Integer id) { |
43 | Blog po = em.find(Blog. class , id); |
44 | return this .parsePo2Vo(po); |
49 | public void update(BlogVo vo) { |
50 | Blog po = this .parseVo2Po(vo); |
55 | public void delete (Integer id) { |
56 | em.remove(em.getReference(Blog. class , id)); |
59 | @SuppressWarnings( "unchecked" ) |
61 | public List<BlogVo> queryAll() { |
62 | List<Blog> list = em.createNamedQuery( "queryAll" ).getResultList(); |
63 | List<BlogVo> volist = new ArrayList<BlogVo>(); |
64 | for (Blog po : list) { |
65 | volist.add( this .parsePo2Vo(po)); |
70 | @SuppressWarnings( "unchecked" ) |
72 | public List<BlogVo> queryByAuthor( String author) { |
73 | Query query = em.createQuery( |
74 | "select t from Blog t where t.author =:author" ).setParameter( |
76 | List<Blog> list = query.getResultList(); |
77 | List<BlogVo> volist = new ArrayList<BlogVo>(); |
78 | for (Blog po : list) { |
79 | volist.add( this .parsePo2Vo(po)); |
84 | private Blog parseVo2Po(BlogVo vo) { |
85 | Blog blog = new Blog(); |
86 | blog.setAuthor(vo.getAuthor()); |
87 | blog.setId(vo.getId()); |
88 | blog.setTitle(vo.getTitle()); |
89 | blog.setUrl(vo.getUrl()); |
93 | private BlogVo parsePo2Vo(Blog po) { |
94 | BlogVo vo = new BlogVo(); |
95 | vo.setAuthor(po.getAuthor()); |
97 | vo.setTitle(po.getTitle()); |
98 | vo.setUrl(po.getUrl()); |
ps:
- @PersistenceContext 用来注入 EntityManager
- unitName 的值”micmiuJPA” 和配置文件persistence.xml 中定义的名称一致
[六]、配置datasource数据源
数据源配置详见:http://www.micmiu.com/j2ee/ejb/ejb-deploy-jboss-ds-config/
[七]、部署EJB工程
导出EJB工程打包,copy 到 JBOSS_HOME/server/default/deploy 默认发布配置下,启动JBOSS即可,能看的类似如下的日志信息:
09:39:43,291 INFO [SessionSpecContainer] Starting jboss.j2ee:jar=EJB-HelloWorld.jar,name=BlogBean,service=EJB3
09:39:43,298 INFO [EJBContainer] STARTED EJB: com.micmiu.ejb.BlogBean ejbName: BlogBean
09:39:43,306 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:
BlogBean/remote – EJB3.x Default Remote Business Interface
BlogBean/remote-com.micmiu.ejb.BlogBeanRemote – EJB3.x Remote Business Interface
[八]、创建客户端测试类
把EJB工程中的Remote接口以及引用到的Vo类导出JAR包,copy到客户端工程中,然后创建客户端调用类:BlogBeanClientTest.java
1 | package com.micmiu.ejb.demo; |
4 | import java.util.Properties; |
6 | import javax.naming.InitialContext; |
7 | import javax.naming.NamingException; |
9 | import com.micmiu.ejb.BlogBeanRemote; |
10 | import com.micmiu.ejb.vo.BlogVo; |
16 | * @time Create on 2013-9-21 下午2:51:59 |
19 | public class BlogBeanClientTest { |
24 | public static void main(String[] args) { |
26 | Properties props = new Properties(); |
27 | props.setProperty( "java.naming.factory.initial" , |
28 | "org.jnp.interfaces.NamingContextFactory" ); |
29 | props.setProperty( "java.naming.provider.url" , "localhost:1099" ); |
30 | props.setProperty( "java.naming.factory.url.pkgs" , |
33 | System.out.println( ">>>> InitialContext " ); |
34 | InitialContext ctx = new InitialContext(props); |
36 | System.out.println( ">>>> lookup " ); |
37 | String serviceName = "BlogBean/remote" ; |
38 | BlogBeanRemote remote = (BlogBeanRemote) ctx.lookup(serviceName); |
40 | System.out.println( ">>>> 操作之前 query michael's Blog" ); |
41 | List<BlogVo> list = remote.queryByAuthor( "michael" ); |
42 | System.out.println( "query result size = " + list.size()); |
43 | for (BlogVo blog : list) { |
44 | System.out.println(blog); |
47 | System.out.println( ">>>> create new blog" ); |
48 | BlogVo blog = new BlogVo(); |
49 | blog.setAuthor( "michael" ); |
50 | blog.setTitle( "图文演示Eclipse+JBoss创建第一个EJB项目" ); |
52 | BlogVo createVo = remote.create(blog); |
53 | System.out.println(createVo); |
55 | System.out.println( ">>>> read exit blog" ); |
56 | BlogVo readVo = remote.read( 1 ); |
57 | System.out.println(readVo); |
59 | System.out.println( ">>>> update blog" ); |
60 | System.out.println( "update title " + readVo.getTitle() |
62 | readVo.setTitle( "大大&&小小" ); |
63 | remote.update(readVo); |
65 | System.out.println( ">>>> 操作之后 query michael's Blog" ); |
66 | list = remote.queryByAuthor( "michael" ); |
67 | System.out.println( ">>>> 结果 = " + list.size()); |
68 | for (BlogVo vo : list) { |
69 | System.out.println(vo); |
72 | } catch (NamingException e) { |
[九]、运行测试类
运行后日志信息如下:
>>>> InitialContext
>>>> lookup
>>>> 操作之前 query michael’s Blog
query result size = 1
BlogVo [id=1, title=Michael的博客, url=http://www.micmiu.com, author=michael]
>>>> create new blog
BlogVo [id=114, title=图文演示Eclipse+JBoss创建第一个EJB项目, url=http://www.micmiu.com/j2ee/ejb/eclipse-jboss-ejb-demo/, author=michael]
>>>> read exit blog
BlogVo [id=1, title=Michael的博客, url=http://www.micmiu.com, author=michael]
>>>> update blog
update title Michael的博客 to 大大&&小小
>>>> 操作之后 query michael’s Blog
>>>> 结果 = 2
BlogVo [id=1, title=大大&&小小, url=http://www.micmiu.com, author=michael]
BlogVo [id=114, title=图文演示Eclipse+JBoss创建第一个EJB项目, url=http://www.micmiu.com/j2ee/ejb/eclipse-jboss-ejb-demo/, author=michael]
本文介绍到此结束@Michael Sun.