Hibernate 3.2支持JPA注解,Spring集成JPA是可选的。
下面是Spring集成JPA的一个例子。
实体类MyUser,使用JPA注解实现到数据库表myUser的映射,如下所示:
package org.shirdrn.entity;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Transient;
@Entity
public class MyUser {
private Long id;
private String userName;
private String password;
private String gender;
private Integer age;
private Integer birthYear;
private String addr;
private String email;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name="userName")
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Column(name="password")
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Column(name="gender")
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Column(name="age")
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Column(name="addr")
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
@Column(name="email")
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Transient
public Integer getBirthYear() {
return new Integer(2008-age);
}
public void setBirthYear(Integer age) {
this.birthYear = new Integer(2008-age);
}
}
其中,birthYear不是数据库中的字段,使用JPA的@Transient注解,在映射的时候,会忽略掉该成员。
持久层DAO接口如下:
package org.shirdrn.dao;
import java.util.List;
import org.shirdrn.entity.MyUser;
import org.springframework.transaction.annotation.Transactional;
@Transactional
public interface MyUserDAO {
public void createMyUser(MyUser myUser);
public void deleteMyUser(MyUser myUser);
public void updateMyUser(MyUser myUser);
public List<MyUser> queryMyUser(String queryString);
public List<MyUser> queryAll();
}
这里,使用了JPA注解,声明事务。
DAO实现类,如下所示:
package org.shirdrn.dao.impl;
import java.util.List;
import org.shirdrn.dao.MyUserDAO;
import org.shirdrn.entity.MyUser;
import org.springframework.orm.jpa.support.JpaDaoSupport;
public class MyUserDAOImpl extends JpaDaoSupport implements MyUserDAO {
public void createMyUser(MyUser myUser) {
getJpaTemplate().persist(myUser);
}
public void deleteMyUser(MyUser myUser) {
MyUser dbMyUser = getJpaTemplate().find(MyUser.class, myUser.getId());
getJpaTemplate().remove(dbMyUser);
}
public void updateMyUser(MyUser myUser) {
MyUser dbMyUser = getJpaTemplate().find(MyUser.class, myUser.getId());
if(myUser.getUserName() != null){
dbMyUser.setUserName(myUser.getUserName());
}
if(myUser.getAddr() != null){
dbMyUser.setAddr(myUser.getAddr());
}
getJpaTemplate().merge(dbMyUser);
}
@SuppressWarnings("unchecked")
public List<MyUser> queryMyUser(String queryString) {
return (List<MyUser>)getJpaTemplate().find(queryString);
}
@SuppressWarnings("unchecked")
public List<MyUser> queryAll() {
return (List<MyUser>)getJpaTemplate().find("from MyUser");
}
}
因为继承了JpaDaoSupport,索引需要获取一个JpaTemplate来实现访问数据库,在Spring的配置文件中要注入一个org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean。
Spring的配置文件applicationContext.xml的内容如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<bean id="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.microsoft.jdbc.sqlserver.SQLServerDriver" />
<property name="url" value="jdbc:microsoft:sqlserver://localhost:1433;databasename=shirdrn" />
<property name="username" value="sa" />
<property name="password" value="111111" />
</bean>
<bean id="myEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="myDataSource"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="true" />
<property name="generateDdl" value="true" />
</bean>
</property>
</bean>
<bean id="jpaTxManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="myEntityManagerFactory"/>
<property name="dataSource" ref="myDataSource"/>
</bean>
<tx:annotation-driven transaction-manager="jpaTxManager"/>
<bean id="myUserDAOImpl" class="org.shirdrn.dao.impl.MyUserDAOImpl"
abstract="false" lazy-init="default" autowire="default"
dependency-check="default">
<property name="entityManagerFactory">
<ref bean="myEntityManagerFactory" />
</property>
</bean>
</beans>
在META-INF目录下,还要加一个persistence.xml配置文件,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<persistence 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_1_0.xsd" version="1.0">
<persistence-unit name="HibernateJPAPU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>org.shirdrn.entity.MyUser</class>
</persistence-unit>
</persistence>
接着,对增删改查操作进行测试,如下所示:
插入记录:
package org.shirdrn.test;
import org.shirdrn.dao.MyUserDAO;
import org.shirdrn.entity.MyUser;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestCreateMyUser {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
MyUserDAO myUserDAO = (MyUserDAO)ctx.getBean("myUserDAOImpl");
MyUser myUser = new MyUser();
myUser.setUserName("JohnXa");
myUser.setPassword("123456");
myUser.setGender("男");
myUser.setAge(new Integer(25));
myUser.setAddr("New York");
myUser.setEmail("john@hotmail.com");
myUserDAO.createMyUser(myUser);
}
}
删除记录:
package org.shirdrn.test;
import org.shirdrn.dao.MyUserDAO;
import org.shirdrn.entity.MyUser;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestDeleteMyUser {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
MyUserDAO myUserDAO = (MyUserDAO)ctx.getBean("myUserDAOImpl");
MyUser myUser = new MyUser();
myUser.setId(new Long(29));
myUserDAO.deleteMyUser(myUser);
}
}
修改记录:
package org.shirdrn.test;
import org.shirdrn.dao.MyUserDAO;
import org.shirdrn.entity.MyUser;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestUpdateMyUser {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
MyUserDAO myUserDAO = (MyUserDAO)ctx.getBean("myUserDAOImpl");
MyUser myUser = new MyUser();
myUser.setId(new Long(28));
myUser.setAddr("北京市");
myUserDAO.updateMyUser(myUser);
}
}
查询记录:
package org.shirdrn.test;
import java.util.List;
import org.shirdrn.dao.MyUserDAO;
import org.shirdrn.entity.MyUser;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestQueryAllMyUser {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
MyUserDAO myUserDAO = (MyUserDAO)ctx.getBean("myUserDAOImpl");
List<MyUser> list = myUserDAO.queryMyUser("from MyUser");
for(MyUser user : list){
System.out.println("ID:"+user.getId()+
"|姓名:"+user.getUserName()+
"|密码:"+user.getPassword()+
"|性别:"+user.getGender()+
"|年龄:"+user.getAge()+
"|住址:"+user.getAddr()+
"|邮箱:"+user.getEmail());
}
}
}