首页 > IT职业 > IT职场 > JAVA JPA - 示例用法
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 27 8 39 80Members
4041 No registered members. 42 4345 7946 49Id 47 #{_member.id} 4850 53Name 51 #{_member.name} 5254 5758 61Phone # 59 #{_member.phoneNumber} 6062 65Address 63 #{_member.address} 6466 78Operation 67 77
7、persistence.xml 配置文件
1 2 38 9 18java:/XE 10META-INF/orm.xml 1112 1713 14 15 16
注:该文件位于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/ ,如需转载,请注明出处,否则将追究法律责任。