1.背景:
JPA本身是一套接口和标准,我们可以使用hibernate的EntityManager模块来作为JPA的引擎
2.JPA使用的环境:
* 1. Java EE:可以在Java EE环境中配置JPA引擎
* 2. Java SE:必须在本地设置引擎:
在classpath根部的META-INF目录下persistence.xml中配置JPA
3.实现步骤:
1)在classpath根部META-INF目录下创建persistence.xml文件,内容如下:
<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="course"> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/> <property name="hibernate.connection.driver_class" value="org.gjt.mm.mysql.Driver"/> <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/db_jpa"/> <property name="hibernate.connection.username" value="root"/> <property name="hibernate.connection.password" value="root"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.hbm2ddl.auto" value="update"/> </properties> </persistence-unit> </persistence>
2)创建实体类,并加上JPA注解,代码如下:
package com.local.domain;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="t_course")
public class Course {
@Id
@GeneratedValue
private Long id;
private String title;
private Date beginDate;
private Date endDate;
private int fee;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Date getBeginDate() {
return beginDate;
}
public void setBeginDate(Date beginDate) {
this.beginDate = beginDate;
}
public Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
public int getFee() {
return fee;
}
public void setFee(int fee) {
this.fee = fee;
}
}
3)编写Dao接口,代码如下:
package com.local.dao;
import com.local.domain.Course;
public interface CourseDao {
public void save(Course course);
public void delete(Long id);
public Course get(Long id);
}
4)编写Dao接口的JPA实现类,代码如下:
package com.local.dao.impl;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import com.local.dao.CourseDao;
import com.local.domain.Course;
public class JpaCourseDao implements CourseDao {
private EntityManagerFactory entityManagerFactory;
public JpaCourseDao() {
entityManagerFactory = Persistence.createEntityManagerFactory("course");
}
@Override
public void delete(Long id) {
EntityManager manager = entityManagerFactory.createEntityManager();
EntityTransaction tx = manager.getTransaction();
try {
tx.begin();
Course course = manager.find(Course.class, id);
manager.remove(course);
tx.commit();
} catch (RuntimeException e) {
tx.rollback();
throw e;
} finally {
manager.close();
}
}
@Override
public Course get(Long id) {
EntityManager manager = entityManagerFactory.createEntityManager();
try {
return manager.find(Course.class, id);
} finally {
manager.close();
}
}
@Override
public void save(Course course) {
EntityManager manager = entityManagerFactory.createEntityManager();
EntityTransaction tx = manager.getTransaction();
try {
tx.begin();
manager.merge(course);
tx.commit();
} catch (RuntimeException e) {
tx.rollback();
throw e;
} finally {
manager.close();
}
}
}
5)进行Junit测试,代码如下:
package com.local.dao.impl;
import java.util.Date;
import org.junit.BeforeClass;
import org.junit.Test;
import com.local.dao.CourseDao;
import com.local.domain.Course;
public class CourseDaoImplTest {
private static CourseDao courseDao;
@BeforeClass
public static void init(){
courseDao=new JpaCourseDao();
}
@Test
public void testSave(){
Course course=new Course();
course.setTitle("course2");
course.setBeginDate(new Date());
course.setEndDate(new Date());
course.setFee(100);
courseDao.save(course);
}
@Test
public void testGet(){
Course course=courseDao.get(new Long(4));
System.out.println("title: "+course.getTitle());
System.out.println("beginDate: "+course.getBeginDate());
System.out.println("endDate: "+course.getEndDate());
System.out.println("fee: "+course.getFee());
}
}
4.关于persistence.xml配置文件的说明:
* 方式一:通过引用hibernate.cfg.xml
【注意此时由于Hibernate EntityManager会自动侦测XML映射文件和JPA注解,将他们作为映射元数据,因此不必再配置文件中显式指明。否则会出现org.hibernate.DuplicateMappingException异常】
<persistence>
<persistence-unit name="course">
<properties>
<!--引用classpath根部的Hibernate配置文件 -->
<property name="hibernate.ejb.cfgfile" value="/hibernate.cfg.xml"/>
</properties>
</persistence-unit>
</persistence>
* 方式二:使用 JNDI数据源,形如:<jta-data-source>java:/DefaultDS</jta-data-source>
其他的hibernate属性在本配置文件中配置
* 方式三:数据库的连接属性和其他属性均通过hibernate的形式在persistence.xml中配置
【本例使用了此方式】