ITPub博客

首页 > IT职业 > IT职场 > JAVA JPA - 示例用法

JAVA JPA - 示例用法

IT职场 作者:snoopyzjs 时间:2021-09-09 09:14:15 0 删除 编辑

JPA(Java Persistence API)是JSR(Java Specification Requests)的一部分,定义了一系列对象持久化的标准,目前实现这一规范的产品有Hibernate、TopLink等。

下面的示例程序是在jboss quickStart的基础上修改而来的

 

1、实体Bean:Member类

 1 package org.jboss.as.quickstart.hibernate4.model;
 2 
 3 import java.io.Serializable;
 4 
 5 import javax.persistence.Column;
 6 import javax.persistence.Entity;
 7 import javax.persistence.GeneratedValue;
 8 import javax.persistence.GenerationType;
 9 import javax.persistence.Id;
10 import javax.persistence.SequenceGenerator;
11 import javax.persistence.Table;
12 import javax.validation.constraints.Digits;
13 import javax.validation.constraints.NotNull;
14 import javax.validation.constraints.Pattern;
15 import javax.validation.constraints.Size;
16 import javax.xml.bind.annotation.XmlRootElement;
17 import org.hibernate.validator.constraints.Email;
18 import org.hibernate.validator.constraints.NotEmpty;
19 
20 @Entity
21 @XmlRootElement
22 @Table(name = "MemberHibernate4Demo")
23 public class Member implements Serializable {
24 
25     private static final long serialVersionUID = 3862416351900991824L;
26 
27     @Id
28     @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MEMBER_ID_GENERATOR")
29     @SequenceGenerator(name = "MEMBER_ID_GENERATOR", sequenceName = "SEQ_MEMBER", allocationSize = 1)
30     private Long id;
31 
32     @NotNull
33     @Size(min = 1, max = 25)
34     @Pattern(regexp = "[A-Za-z ]*", message = "must contain only letters and spaces")
35     private String name;
36 
37     @NotNull
38     @NotEmpty
39     @Email
40     private String email;
41 
42     @NotNull
43     @Size(min = 9, max = 12)
44     @Digits(fraction = 0, integer = 12)
45     @Column(name = "phone_number")
46     private String phoneNumber;
47 
48     private String address;
49 
50     public Long getId() {
51         return id;
52     }
53 
54     public void setId(Long id) {
55         this.id = id;
56     }
57 
58     public String getName() {
59         return name;
60     }
61 
62     public void setName(String name) {
63         this.name = name;
64     }
65 
66     public String getEmail() {
67         return email;
68     }
69 
70     public void setEmail(String email) {
71         this.email = email;
72     }
73 
74     public String getPhoneNumber() {
75         return phoneNumber;
76     }
77 
78     public void setPhoneNumber(String phoneNumber) {
79         this.phoneNumber = phoneNumber;
80     }
81 
82     public String getAddress() {
83         return address;
84     }
85 
86     public void setAddress(String address) {
87         this.address = address;
88     }
89 
90     public String toString() {
91 
92         return "id:" + id + ",name:" + name + ",email:" + email
93                 + ",phoneNumber:" + phoneNumber + ",address:" + address;
94     }
95 }

注意:私有成员id上的注解@SequenceGenerator、@GeneratedValue演示Oracle中序列(Sequence)的用法。

 

2、服务接口 MemberService

 1 package org.jboss.as.quickstart.hibernate4.service;
 2 
 3 import java.util.List;
 4 
 5 import org.jboss.as.quickstart.hibernate4.model.Member;
 6 
 7 public interface MemberService {
 8 
 9     void addMember(Member member) throws Exception;
10 
11     void updateMember(Member member) throws Exception;
12 
13     void deleteMember(long id) throws Exception;
14 
15     Member findMember(long id) throws Exception;
16 
17     List getMembers() throws Exception;
18 
19 }

 

3、服务实现 MemberServiceImpl

 1 package org.jboss.as.quickstart.hibernate4.service;
 2 
 3 import java.util.logging.Logger;
 4 import java.util.List;
 5 import javax.ejb.Stateless;
 6 import javax.enterprise.event.Event;
 7 import javax.inject.Inject;
 8 import javax.persistence.EntityManager;
 9 import javax.persistence.PersistenceContext;
10 import org.jboss.as.quickstart.hibernate4.model.Member;
11 
12 @Stateless
13 public class MemberServiceImpl implements MemberService {
14 
15     @PersistenceContext  
16     private EntityManager em;
17 
18     @Inject
19     private Logger log;
20 
21     @Inject
22     private Event memberEventSrc;
23 
24     @Override
25     public void addMember(Member member) throws Exception {
26         log.info("addMember => " + member.toString());
27         member.setId(null);
28         em.persist(member);
29         memberEventSrc.fire(member);
30     }
31 
32     @Override
33     public void updateMember(Member member) throws Exception {
34         log.info("updateMember => " + member.getName());
35         if (member.getId() > 0) {
36             Member updateObj = findMember(member.getId());
37             updateObj.setAddress(member.getAddress());
38             updateObj.setEmail(member.getEmail());
39             updateObj.setName(member.getName());
40             updateObj.setPhoneNumber(member.getPhoneNumber());
41             em.merge(updateObj);
42             memberEventSrc.fire(updateObj);
43         }
44 
45     }
46 
47     @Override
48     public void deleteMember(long id) throws Exception {
49         log.info("deleteMember => " + id);
50         Member member = findMember(id);
51         em.remove(member);
52         memberEventSrc.fire(member);
53 
54     }
55 
56     @Override
57     public List getMembers() throws Exception {
58         @SuppressWarnings("unchecked")
59         List members = em.createQuery("from Member").getResultList();
60         return members;
61 
62     }
63 
64     @Override
65     public Member findMember(long id) throws Exception {
66         log.info("findMember => " + id);
67         return em.find(Member.class, id);
68     }
69 
70 }

注意:此外大量使用了CDI来实现对象的依赖注入,@PersistenceContext 用于在EJB容器中自动注入"实体管理器"(所以类上要使用@Stateless表示,这是一个无状态的EJB),上面这段代码演示了数据的基础CRUD(Create、Retrieve、Update、Delete)操作,另外为了配合CDI的@Inject注入,还需要一些@Produces的辅助工具类。(对CDI不熟悉的,可以先看看这里 http://www.cnblogs.com/yjmyzz/p/j2ee-cdi-inject.html )

 

4、辅助类 Resouces 

 1 package org.jboss.as.quickstart.hibernate4.util;
 2 
 3 import java.util.Map;
 4 import java.util.logging.Logger;
 5 import javax.enterprise.context.RequestScoped;
 6 import javax.enterprise.inject.Produces;
 7 import javax.enterprise.inject.spi.InjectionPoint;
 8 import javax.faces.context.FacesContext;
 9 
10 public class Resources {
11 
12     @Produces
13     public Logger produceLog(InjectionPoint injectionPoint) {
14         return Logger.getLogger(injectionPoint.getMember().getDeclaringClass()
15                 .getName());
16     }
17 
18     @Produces
19     @RequestScoped
20     public FacesContext produceFacesContext() {
21         return FacesContext.getCurrentInstance();
22     }
23     
24     @Produces
25     @RequestScoped
26     public Map getRequestParameterMap(){
27         return FacesContext.getCurrentInstance().getExternalContext()
28                 .getRequestParameterMap();
29     } 
30     
31 
32 }

注:该类主要用@Produces提供了CDI注入对象的实例化方法。

 

5、web层的Controller:MemberController

  1 package org.jboss.as.quickstart.hibernate4.controller;
  2 
  3 import java.util.List;
  4 import java.util.Map;
  5 
  6 import javax.annotation.PostConstruct;
  7 import javax.enterprise.inject.Model;
  8 import javax.enterprise.inject.Produces;
  9 import javax.faces.application.FacesMessage;
 10 import javax.faces.context.FacesContext;
 11 import javax.inject.Inject;
 12 import javax.inject.Named;
 13 
 14 import org.jboss.as.quickstart.hibernate4.model.Member;
 15 import org.jboss.as.quickstart.hibernate4.service.MemberService;
 16 
 17 @Model
 18 public class MemberController {
 19 
 20     @Inject
 21     MemberService service;
 22 
 23     @Inject
 24     private FacesContext facesContext;
 25 
 26     @Inject
 27     private Map requestMap;
 28 
 29     private Member newMember;
 30 
 31     @Produces
 32     @Named
 33     public Member getNewMember() {
 34         return newMember;
 35     }
 36 
 37     @Produces
 38     @Named
 39     public List getMembers() {
 40         List members = null;
 41         try {
 42             members = service.getMembers();
 43 
 44         } catch (Exception e) {
 45             String errorMessage = getRootErrorMessage(e);
 46             facesContext.addMessage(null, new FacesMessage(
 47                     FacesMessage.SEVERITY_ERROR, errorMessage,
 48                     "Delete unsuccessful"));
 49         }
 50         return members;
 51     }
 52 
 53     public void deleteMemberById() {
 54         try {
 55             String id = requestMap.get("id");
 56             service.deleteMember(Long.parseLong(id));
 57 
 58         } catch (Exception e) {
 59             String errorMessage = getRootErrorMessage(e);
 60             facesContext.addMessage(null, new FacesMessage(
 61                     FacesMessage.SEVERITY_ERROR, errorMessage,
 62                     "Delete unsuccessful"));
 63         }
 64 
 65     }
 66 
 67     public void findMemberById() {
 68         try {
 69             String id = requestMap.get("id");
 70             newMember = service.findMember(Long.parseLong(id));
 71         } catch (Exception e) {
 72             String errorMessage = getRootErrorMessage(e);
 73             facesContext.addMessage(null, new FacesMessage(
 74                     FacesMessage.SEVERITY_ERROR, errorMessage,
 75                     "Find Member unsuccessful"));
 76         }
 77 
 78     }
 79 
 80     public void register() {
 81         try {
 82             if (newMember.getId() > 0) {
 83                 service.updateMember(newMember);
 84                 facesContext.addMessage(null, new FacesMessage(
 85                         FacesMessage.SEVERITY_INFO, "Updated!",
 86                         "Update successful"));
 87             } else {
 88                 service.addMember(newMember);
 89                 facesContext.addMessage(null, new FacesMessage(
 90                         FacesMessage.SEVERITY_INFO, "Registered!",
 91                         "Registration successful"));
 92             }
 93             initNewMember();
 94         } catch (Exception e) {
 95             String errorMessage = getRootErrorMessage(e);
 96             facesContext.addMessage(null, new FacesMessage(
 97                     FacesMessage.SEVERITY_ERROR, errorMessage,
 98                     "Save unsuccessful"));
 99         }
100     }
101 
102     @PostConstruct
103     public void initNewMember() {
104         newMember = new Member();
105     }
106 
107     private String getRootErrorMessage(Exception e) {
108         String errorMessage = "Registration failed. See server log for more information";
109         if (e == null) {
110             return errorMessage;
111         }
112 
113         Throwable t = e;
114         while (t != null) {
115 
116             errorMessage = t.getLocalizedMessage();
117             t = t.getCause();
118         }
119 
120         return errorMessage;
121     }
122 
123 }

 

6、UI界面index.xhtml


 1 
 2 
 7     
 8         
 9             

Member Registration

10  11              12                  13                  14                  15                  16  17                  18                  19                  20  21                  22                  23                  24  25                  26                  27                  28              29  30  31              32                  34                  36              37  38         
39         

Members

40          41             No registered members. 42          43          45              46                 Id 47                 #{_member.id} 48              49              50                 Name 51                 #{_member.name} 52              53              54                 Email 55                 #{_member.email} 56              57              58                 Phone # 59                 #{_member.phoneNumber} 60              61              62                 Address 63                 #{_member.address} 64              65              66                 Operation 67                 
68                      70                          71                     | 72                  74                          75                      76                 
77             
78         
79     
80 

 

7、persistence.xml 配置文件

 1 
 2 
 3 
 8     
 9         java:/XE
10         META-INF/orm.xml
11         
12             
13             
14             
15                         
16         
17     
18 

注:该文件位于src/main/resources/META-INF/目录下。java:/XE 是Jboss上配置好的一个数据源JNDI字符串。hibernate.hbm2ddl.auto属性值为create-drop,表明webapp启动时,会自动在db中创建表、序列对象,webapp停止时这些对象会自动drop

 

8、db初始化脚本 import.sql (测试的时候十分有用)

1 insert into MemberHibernate4Demo (id, name, email, phone_number, address) values (SEQ_MEMBER.NEXTVAL, 'John Smith', 'john.smith@mailinator.com', '2125551212', 'Boston NY') 
2 insert into MemberHibernate4Demo (id, name, email, phone_number, address) values (SEQ_MEMBER.NEXTVAL, 'Madhumita Sadhukhan', 'msadhukh@gmail.com', '2135551214', 'Brno CZ')

注:该文件位于src/main/resources目录下,webapp启用时将自动执行该文件中的db 脚本 

 

9、其它运行准备:
9.1 要有Oracle Database环境,比如本机可以安装一个Express版本

9.2 Jboss中要配置一个java:/XE的数据源,步骤:

a) 先部署ojdbc6.jar (这是oracle驱动,安装oracle XE或client后,本机安装目录下就能找到)

b) 添加oracle 数据源,数据库驱动选择ojdbc6.jar,连接串参考 jdbc:oracle:thin:@localhost:1521:XE

 

示例程序下载:http://files.cnblogs.com/yjmyzz/jboss-jpa-sample.zip

运行截图:

图片描述 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/1414/viewspace-2800930/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-04-15

  • 博文量
    104
  • 访问量
    1015