JAVA JPA - 示例用法
JPA(Java Persistence API)是JSR(Java Specification Requests)的一部分,定义了一系列对象持久化的标准,目前实现这一规范的产品有Hibernate、TopLink等。
下面的示例程序是在jboss quickStart的基础上修改而来的
1、实体Bean:Member类
package org.jboss.as.quickstart.hibernate4.model; import java.io.Serializable; import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.validation.constraints.Digits;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty; @Entity
@XmlRootElement
@Table(name = "MemberHibernate4Demo")
public class Member implements Serializable { private static final long serialVersionUID = 3862416351900991824L; @Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MEMBER_ID_GENERATOR")
@SequenceGenerator(name = "MEMBER_ID_GENERATOR", sequenceName = "SEQ_MEMBER", allocationSize = 1)
private Long id; @NotNull
@Size(min = 1, max = 25)
@Pattern(regexp = "[A-Za-z ]*", message = "must contain only letters and spaces")
private String name; @NotNull
@NotEmpty
private String email; @NotNull
@Size(min = 9, max = 12)
@Digits(fraction = 0, integer = 12)
@Column(name = "phone_number")
private String phoneNumber; private String address; public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
} public String getPhoneNumber() {
return phoneNumber;
} public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
} public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
} public String toString() { return "id:" + id + ",name:" + name + ",email:" + email
+ ",phoneNumber:" + phoneNumber + ",address:" + address;
}
}
Member
注意:私有成员id上的注解@SequenceGenerator、@GeneratedValue演示Oracle中序列(Sequence)的用法。
2、服务接口 MemberService
package org.jboss.as.quickstart.hibernate4.service; import java.util.List; import org.jboss.as.quickstart.hibernate4.model.Member; public interface MemberService { void addMember(Member member) throws Exception; void updateMember(Member member) throws Exception; void deleteMember(long id) throws Exception; Member findMember(long id) throws Exception; List<Member> getMembers() throws Exception; }
MemberService
3、服务实现 MemberServiceImpl
package org.jboss.as.quickstart.hibernate4.service; import java.util.logging.Logger;
import java.util.List;
import javax.ejb.Stateless;
import javax.enterprise.event.Event;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.jboss.as.quickstart.hibernate4.model.Member; @Stateless
public class MemberServiceImpl implements MemberService { @PersistenceContext
private EntityManager em; @Inject
private Logger log; @Inject
private Event<Member> memberEventSrc; @Override
public void addMember(Member member) throws Exception {
log.info("addMember => " + member.toString());
member.setId(null);
em.persist(member);
memberEventSrc.fire(member);
} @Override
public void updateMember(Member member) throws Exception {
log.info("updateMember => " + member.getName());
if (member.getId() > 0) {
Member updateObj = findMember(member.getId());
updateObj.setAddress(member.getAddress());
updateObj.setEmail(member.getEmail());
updateObj.setName(member.getName());
updateObj.setPhoneNumber(member.getPhoneNumber());
em.merge(updateObj);
memberEventSrc.fire(updateObj);
} } @Override
public void deleteMember(long id) throws Exception {
log.info("deleteMember => " + id);
Member member = findMember(id);
em.remove(member);
memberEventSrc.fire(member); } @Override
public List<Member> getMembers() throws Exception {
@SuppressWarnings("unchecked")
List<Member> members = em.createQuery("from Member").getResultList();
return members; } @Override
public Member findMember(long id) throws Exception {
log.info("findMember => " + id);
return em.find(Member.class, id);
} }
MemberService
注意:此外大量使用了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
package org.jboss.as.quickstart.hibernate4.util; import java.util.Map;
import java.util.logging.Logger;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.faces.context.FacesContext; public class Resources { @Produces
public Logger produceLog(InjectionPoint injectionPoint) {
return Logger.getLogger(injectionPoint.getMember().getDeclaringClass()
.getName());
} @Produces
@RequestScoped
public FacesContext produceFacesContext() {
return FacesContext.getCurrentInstance();
} @Produces
@RequestScoped
public Map<String, String> getRequestParameterMap(){
return FacesContext.getCurrentInstance().getExternalContext()
.getRequestParameterMap();
} }
Resources
注:该类主要用@Produces提供了CDI注入对象的实例化方法。
5、web层的Controller:MemberController
package org.jboss.as.quickstart.hibernate4.controller; import java.util.List;
import java.util.Map; import javax.annotation.PostConstruct;
import javax.enterprise.inject.Model;
import javax.enterprise.inject.Produces;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named; import org.jboss.as.quickstart.hibernate4.model.Member;
import org.jboss.as.quickstart.hibernate4.service.MemberService; @Model
public class MemberController { @Inject
MemberService service; @Inject
private FacesContext facesContext; @Inject
private Map<String, String> requestMap; private Member newMember; @Produces
@Named
public Member getNewMember() {
return newMember;
} @Produces
@Named
public List<Member> getMembers() {
List<Member> members = null;
try {
members = service.getMembers(); } catch (Exception e) {
String errorMessage = getRootErrorMessage(e);
facesContext.addMessage(null, new FacesMessage(
FacesMessage.SEVERITY_ERROR, errorMessage,
"Delete unsuccessful"));
}
return members;
} public void deleteMemberById() {
try {
String id = requestMap.get("id");
service.deleteMember(Long.parseLong(id)); } catch (Exception e) {
String errorMessage = getRootErrorMessage(e);
facesContext.addMessage(null, new FacesMessage(
FacesMessage.SEVERITY_ERROR, errorMessage,
"Delete unsuccessful"));
} } public void findMemberById() {
try {
String id = requestMap.get("id");
newMember = service.findMember(Long.parseLong(id));
} catch (Exception e) {
String errorMessage = getRootErrorMessage(e);
facesContext.addMessage(null, new FacesMessage(
FacesMessage.SEVERITY_ERROR, errorMessage,
"Find Member unsuccessful"));
} } public void register() {
try {
if (newMember.getId() > 0) {
service.updateMember(newMember);
facesContext.addMessage(null, new FacesMessage(
FacesMessage.SEVERITY_INFO, "Updated!",
"Update successful"));
} else {
service.addMember(newMember);
facesContext.addMessage(null, new FacesMessage(
FacesMessage.SEVERITY_INFO, "Registered!",
"Registration successful"));
}
initNewMember();
} catch (Exception e) {
String errorMessage = getRootErrorMessage(e);
facesContext.addMessage(null, new FacesMessage(
FacesMessage.SEVERITY_ERROR, errorMessage,
"Save unsuccessful"));
}
} @PostConstruct
public void initNewMember() {
newMember = new Member();
} private String getRootErrorMessage(Exception e) {
String errorMessage = "Registration failed. See server log for more information";
if (e == null) {
return errorMessage;
} Throwable t = e;
while (t != null) { errorMessage = t.getLocalizedMessage();
t = t.getCause();
} return errorMessage;
} }
MemberController
6、UI界面index.xhtml
<?xml version="1.0" encoding="UTF-8"?>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
template="/WEB-INF/templates/default.xhtml">
<ui:define name="content">
<h:form id="reg">
<h2>Member Registration</h2> <h:panelGrid columns="3" width="100%" columnClasses="titleCell">
<h:inputHidden value="#{newMember.id}" id="id" />
<h:outputLabel for="name" value="Name:" />
<h:inputText id="name" value="#{newMember.name}" />
<h:message for="name" errorClass="invalid" /> <h:outputLabel for="email" value="Email:" />
<h:inputText id="email" value="#{newMember.email}" />
<h:message for="email" errorClass="invalid" /> <h:outputLabel for="phoneNumber" value="Phone #:" />
<h:inputText id="phoneNumber" value="#{newMember.phoneNumber}" />
<h:message for="phoneNumber" errorClass="invalid" /> <h:outputLabel for="address" value="Address:" />
<h:inputText id="address" value="#{newMember.address}" />
<h:message for="address" errorClass="invalid" />
</h:panelGrid> <h:panelGrid columns="2">
<h:commandButton id="register" action="#{memberController.register}"
value="Register" styleClass="register" />
<h:messages styleClass="messages" errorClass="invalid"
infoClass="valid" warnClass="warning" globalOnly="true" />
</h:panelGrid> </h:form>
<h2>Members</h2>
<h:panelGroup rendered="#{empty members}">
<em>No registered members.</em>
</h:panelGroup>
<h:dataTable var="_member" value="#{members}"
rendered="#{not empty members}" styleClass="simpletablestyle">
<h:column>
<f:facet name="header">Id</f:facet>
#{_member.id}
</h:column>
<h:column>
<f:facet name="header">Name</f:facet>
#{_member.name}
</h:column>
<h:column>
<f:facet name="header">Email</f:facet>
#{_member.email}
</h:column>
<h:column>
<f:facet name="header">Phone #</f:facet>
#{_member.phoneNumber}
</h:column>
<h:column>
<f:facet name="header">Address</f:facet>
#{_member.address}
</h:column>
<h:column>
<f:facet name="header">Operation</f:facet>
<h:form style="border:none">
<h:commandLink action="#{memberController.deleteMemberById}"
value="delete">
<f:param name="id" value="#{_member.id}"></f:param>
</h:commandLink>|
<h:commandLink action="#{memberController.findMemberById}"
value="update">
<f:param name="id" value="#{_member.id}"></f:param>
</h:commandLink>
</h:form>
</h:column>
</h:dataTable>
</ui:define>
</ui:composition>
index.xhtml
7、persistence.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="primary">
<jta-data-source>java:/XE</jta-data-source>
<mapping-file>META-INF/orm.xml</mapping-file>
<properties>
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.use_sql_comments" value="true"/>
</properties>
</persistence-unit>
</persistence>
persistence.xml
注:该文件位于src/main/resources/META-INF/目录下。java:/XE 是Jboss上配置好的一个数据源JNDI字符串。hibernate.hbm2ddl.auto属性值为create-drop,表明webapp启动时,会自动在db中创建表、序列对象,webapp停止时这些对象会自动drop
8、db初始化脚本 import.sql (测试的时候十分有用)
insert into MemberHibernate4Demo (id, name, email, phone_number, address) values (SEQ_MEMBER.NEXTVAL, 'John Smith', 'john.smith@mailinator.com', '2125551212', 'Boston NY')
insert into MemberHibernate4Demo (id, name, email, phone_number, address) values (SEQ_MEMBER.NEXTVAL, 'Madhumita Sadhukhan', 'msadhukh@gmail.com', '2135551214', 'Brno CZ')
import.sql
注:该文件位于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
运行截图:
JAVA JPA - 示例用法的更多相关文章
- 多线程java的concurrent用法详解(转载)
我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然没有JDK自带的功能使用起来方便.而当针对高质量Java ...
- Java Spring IOC用法
Java Spring IOC用法 Spring IoC 在前两篇文章中,我们讲了java web环境搭建 和 java web项目搭建,现在看下spring ioc在java中的运用,开发工具为In ...
- 四种Java线程池用法解析
本文为大家分析四种Java线程池用法,供大家参考,具体内容如下 http://www.jb51.net/article/81843.htm 1.new Thread的弊端 执行一个异步任务你还只是如下 ...
- java的concurrent用法详解
我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然没有JDK自带的功能使用起来方便.而当针对高质量Java ...
- java assert的用法简介【转】
assert的基本用法 assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制,如C,C++和Eiffel等,但是支持的形式不尽相同,有的是通过语言本身.有的是通过库 ...
- 从一个简单的 JPA 示例开始
本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示例:接着重构该示例,并引入 Sp ...
- Java之反射 — 用法及原理
Java之反射 - 用法及原理 定义 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象 ...
- java this的用法以及原理
/** * this存在方法中,在方法中被调用. * 且是非static方法中被调用.(this 表示这个类的当前实例,而静态方法不依赖于该类的任何实例,随着类产生而装载,因此方法内不能引用 this ...
- JAVA的continue用法
JAVA的continue用法: public class test{ public static void main(String [] args){ for(int i=0;i<=10;i ...
随机推荐
- Nodejs——包与NPM
在模块之外,包和NPM则是将模块联系起来的一种机制. CommonJS的包规范由包结构和包描述文件组成. 包实际上是一个存档文件,即一个目录直接打包为.zip或tar.gz格式的文件. 完全符合Com ...
- 创建用户故事地图(User Story Mapping)的8个步骤
[小编]上周六了解了用户故事地图后,小编又查阅了一些资料,找到了以下这篇关于如何组织用户故事地图规划的文章,分享给大家.也希望大家如果有好的实践,也可以留言一起交流. 原文地址:http://winn ...
- 使用T-SQL进行活动目录查询
最近在某个项目中,需要针对TFS的用户按照所属的AD组来进行数据分析,但发现TFS中并没有存储用户所属的组信息,故考虑直接从AD中提取这个信息并存放在SQL Server的数据库表里面去. 经过一番G ...
- MVC 多语言记录1 设置默认的ResourceType
http://stackoverflow.com/questions/3260748/default-resource-for-data-annotations-in-asp-net-mvc Add ...
- Javascript之旅——第十一站:原型也不好理解?
写到这篇,我的js系列也快接近尾声了,所以这个系列不会遗留js来实现面向对象的核心——原型,有些人说原型不好理解,其实嘛,要想系统 的理解原型,最便捷的方式就是看看经典的书,少看些博客,博客这东西只是 ...
- Apache虚拟主机配置
在一个Apache服务器上可以配置多个虚拟主机,实现一个服务器提供多站点服务,其实就是访问同一个服务器上的不同目录.Apache虚拟主机配置有3中方法:基于IP配置.基于域名配置和基于端口配置,这里介 ...
- InnoDB源码分析--缓冲池(二)
转载请附原文链接:http://www.cnblogs.com/wingsless/p/5578727.html 上一篇中我简单的分析了一下InnoDB缓冲池LRU算法的相关源码,其实说不上是分析,应 ...
- 虚拟机centos6.5 --ssh免密码登录
说明:此处是以hadoop虚拟机3台机器为背景进行设置,即master.slave01.slave02 1.在master上,生成公钥.私钥 用hadoop用户登录系统,进入个人主目录,即/home/ ...
- MarkDown插入图片
MarkDown插入图片的语法 ·编辑器:MacDown 比如博客园的Logo,URL是 http://static.cnblogs.com/images/logo_small.gif 在要插入图片的 ...
- NServiceBus 更换服务名及队列名称
可以通过起动时的参数处理 NServiceBus.Host.exe /serviceName:”服务名称” /endpointName:”默认队列名称”