Hibernate 3.2支持JPA注解,Spring集成JPA是可選的。
下面是Spring集成JPA的一個(gè)例子。
實(shí)體類MyUser,使用JPA注解實(shí)現(xiàn)到數(shù)據(jù)庫(kù)表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不是數(shù)據(jù)庫(kù)中的字段,使用JPA的@Transient注解,在映射的時(shí)候,會(huì)忽略掉該成員。
持久層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 queryMyUser(String queryString); public List queryAll(); } |
這里,使用了JPA注解,聲明事務(wù)。
DAO實(shí)現(xiàn)類,如下所示:
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 queryMyUser(String queryString) { return (List)getJpaTemplate().find(queryString); } @SuppressWarnings("unchecked") public List queryAll() { return (List)getJpaTemplate().find("from MyUser"); } } |
因?yàn)槔^承了JpaDaoSupport,索引需要獲取一個(gè)JpaTemplate來(lái)實(shí)現(xiàn)訪問(wèn)數(shù)據(jù)庫(kù),在Spring的配置文件中要注入一個(gè)org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean。#p#
Spring的配置文件applicationContext.xml的內(nèi)容如下所示:
abstract="false"lazy-init="default"autowire="default" dependency-check="default">
|
在META-INF目錄下,還要加一個(gè)persistence.xml配置文件,如下所示:
org.hibernate.ejb.HibernatePersistence org.shirdrn.entity.MyUser |
接著,對(duì)增刪改查操作進(jìn)行測(cè)試,如下所示:
插入記錄:
packageorg.shirdrn.test; importorg.shirdrn.dao.MyUserDAO; importorg.shirdrn.entity.MyUser; importorg.springframework.context.ApplicationContext; importorg.springframework.context.support.ClassPathXmlApplicationContext; publicclassTestCreateMyUser{ publicstaticvoidmain(String[]args){ MyUserDAOmyUserDAO=(MyUserDAO)ctx.getBean("myUserDAOImpl"); MyUsermyUser=newMyUser(); myUser.setUserName("JohnXa"); myUser.setPassword("123456"); myUser.setGender("男"); myUser.setAge(newInteger(25)); myUser.setAddr("NewYork"); myUser.setEmail("john@hotmail.com"); myUserDAO.createMyUser(myUser); } } |
刪除記錄:
packageorg.shirdrn.test; importorg.shirdrn.dao.MyUserDAO; importorg.shirdrn.entity.MyUser; importorg.springframework.context.ApplicationContext; importorg.springframework.ClassPathXmlApplicationContext; publicclassTestDeleteMyUser{ publicstaticvoidmain(String[]args){ ApplicationContextctx=newClassPathXml("applicationContext.xml"); MyUserDAOmyUserDAO=(MyUserDAO)ctx.getBean("myUserDAOImpl"); MyUsermyUser=newMyUser(); myUser.setId(newLong(29)); myUserDAO.deleteMyUser(myUser); |
修改記錄:
packageorg.shirdrn.test; importorg.shirdrn.dao.MyUserDAO; importorg.shirdrn.entity.MyUser; importorg.springframework.context.ApplicationContext; importorg.springframework.context.ClassPathXmlApplicationContext;
publicclassTestUpdateMyUser{ publicstaticvoidmain(String[]args){ ApplicationContextctx=newClassPathXmlApplicationContext("applicationContext.xml"); MyUserDAOmyUserDAO=(MyUserDAO)ctx.getBean("myUserDAOImpl"); MyUsermyUser=newMyUser(); myUser.setId(newLong(28)); myUser.setAddr("北京市"); myUserDAO.updateMyUser(myUser); } } |
查詢記錄:
packageorg.shirdrn.test; importjava.util.List; importorg.shirdrn.dao.MyUserDAO; importorg.shirdrn.entity.MyUser; importorg.springframework.context.ApplicationContext; importorg.springframework.context.ClassPathXmlApplicationContext; publicclassTestQueryAllMyUser{ publicstaticvoidmain(String[]args){ ApplicationContextctx=newClassPathXmContext("applicationContext.xml"); MyUserDAOmyUserDAO=(MyUserDAO)ctx.getBean("myUserDAOImpl"); Listlist=myUserDAO.queryMyUser("fromMyUser"); for(MyUseruser:list){ System.out.println("ID:"+user.getId()+ "|姓名:"+user.getUserName()+ "|密碼:"+user.getPassword()+ "|性別:"+user.getGender()+ "|年齡:"+user.getAge()+ "|住址:"+user.getAddr()+ "|郵箱:"+user.getEmail()); } } } |
心得總結(jié)
感覺(jué)自己對(duì)JPA的理解還是不怎么深刻。
JpaTemplate提供的一些操作的方法,感覺(jué)不是很快就能理解的。
似乎使用JpaTemplate沒(méi)有使用HibernateTemplate方便,尤其是在執(zhí)行插入、修改、刪除記錄的時(shí)候。修改和刪除記錄需要先把數(shù)據(jù)庫(kù)中對(duì)應(yīng)的記錄加載出來(lái),才能執(zhí)行修改和刪除操作。
查詢數(shù)據(jù)庫(kù)倒是很容易,因?yàn)楦静恍枰聞?wù),如果沒(méi)有事務(wù),插入、修改和刪除操作就不能實(shí)現(xiàn)。
在Spring中使用JPA,感覺(jué)代價(jià)比較大,使用起來(lái)不容易,出錯(cuò)不容易調(diào)試。
比較好的地方就是。如果數(shù)據(jù)庫(kù)中的表很多,無(wú)需編寫(xiě)大量的XML文件去映射,而且只需要從POJO中就可以非常直觀地看到各個(gè)表之間的關(guān)系。
您正在閱讀:
在Spring框架中集成JPA實(shí)例
【編輯推薦】
- Spring中文手冊(cè)RC2隨Spring2.0同步全球發(fā)行
- Eclipse開(kāi)發(fā): Struts 2 + Spring 2 + JPA + AJAX
- Spring 2.5 中配置 JPA