1:新建一个Maven工程,并引入相应的依赖
<dependency>
<groupId>org.apache.openjpa</groupId>
<artifactId>openjpa-all</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>com.driver</groupId>
<artifactId>sqlserver</artifactId>
<version>2008</version>
</dependency>
2:新建一个jpa的配置文件。persistence.xml
位置
标准java工程:src/META-INF/
Maven工程:src/main/resources/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"version="2.0">
<!-- 持久化单元 -->
<persistence-unit name="FirstJpa"
transaction-type="RESOURCE_LOCAL">
<!--jpa的供应商(hibernate/eclipselink/openjpa) -->
<!-- OpenJPA 持久化实现 -->
<provider>
org.apache.openjpa.persistence.PersistenceProviderImpl
</provider>
<!-- 指定哪些实体需要持久化 -->
<class>com.jpa.entity.UserBean</class>
<!-- 配置数据库连接信息 -->
<properties>
<property name="javax.persistence.jdbc.driver"
value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<property name="javax.persistence.jdbc.url"
value="jdbc:sqlserver://localhost:1433;DatabaseName=java1411;SelectMethod=cursor;"/>
<property name="javax.persistence.jdbc.user" value="sa" />
<property name="javax.persistence.jdbc.password" value="" />
</properties>
</persistence-unit>
</persistence>
3:新建一个实体对象
UserBean.java
4:将实体对象配置到persistence.xml中。
<!--指定哪些实体需要持久化 -->
<class>com.jpa.entity.UserBean</class>
5:JPA中的标准接口
1:EntityManagerFactory(SessionFactory):
javax.persistence.EntityManagerFactory类是创建EntityManager的工厂类。
2:EntityManager:(Session)
javax.persistence.EntityManager是应用中主要使用的接口,它主要用于管理持久对象,也用于创建Query接口。
3:Query:javax.persistence.Query(Query接口)
接口用于持久对象的查询。它支持JavaPersistence Query Language (JPQL) ---->HQL
和Structured Query Language (SQL)。
4:EntityTransaction:EntityTransaction 用于封装事务, (Transaction)
javax.persistence.EntityTransaction和EntityManager之间是一对一的关系
5:Entity。Entity用于封装持久对象。(实体对象)
6:Persistence:javax.persistence.Persistence类包含静态方法用于获得EntityManagerFactory对象。
7:PersistenceException:JPA异常体系的根是PersistenceException,
它继承于RuntimeException。OpenJPA中抛出的异常都实现了
org.apache.openjpa.util.ExceptionInfo接口,用于提供额外的信息。
6:编写JPa的工具类。JpaUtil
import javax.persistence.EntityManager;import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class JpaUtil {
private static final EntityManagerFactory emf;
private static final ThreadLocal<EntityManager> threadLocal;
static {
emf = Persistence.createEntityManagerFactory("FirstJpa");
threadLocal = new ThreadLocal<EntityManager>();
}
public static EntityManager getEntityManager() {
EntityManager manager = threadLocal.get();
if (manager == null || !manager.isOpen()) {
manager = emf.createEntityManager();
threadLocal.set(manager);
}
return manager;
}
public static void closeEntityManager() {
EntityManager em = threadLocal.get();
threadLocal.set(null);
if (em != null)
em.close();
}
}
7:测试
Jpa与Hibernate中方法的区别
JPA Hibernate
persist save
getReference load
find get
merge update
remove delete
查询
query.getResultList query.list();
query.getSingleResult query.uniqueResult();
分页
query.setFirstResult(2);
query.setMaxResults(2);
8:将OpenJpa切换为Hibernate
0:Hibernate的persistence.xml的配置
<?xml version="1.0"encoding="UTF-8"?>
<persistencexmlns="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-unitname="FirstJpa"
transaction-type="RESOURCE_LOCAL">
<provider>
org.hibernate.jpa.HibernatePersistenceProvider
</provider>
<class>com.jpa.entity.UserBean</class>
<properties>
<propertyname="javax.persistence.jdbc.driver"
value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<propertyname="javax.persistence.jdbc.url"
value="jdbc:sqlserver://localhost:1433;DatabaseName=java1411;SelectMethod=cursor;"/>
<propertyname="javax.persistence.jdbc.user" value="sa" />
<propertyname="javax.persistence.jdbc.password" value="" />
</properties>
</persistence-unit>
</persistence>
OpenJpa的persistence.xml的配置
<?xml version="1.0"encoding="UTF-8"?>
<persistencexmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"version="2.0">
<persistence-unitname="FirstJpa"
transaction-type="RESOURCE_LOCAL">
<provider>
org.apache.openjpa.persistence.PersistenceProviderImpl
</provider>
<class>com.jpa.entity.UserBean</class>
<class>com.jpa.entity.ScoreBean</class>
<class>com.jpa.entity.ScoreID</class>
<class>com.jpa.entity.many_to_one.GroupBean</class>
<class>com.jpa.entity.many_to_one.GroupUser</class>
<class>com.jpa.entity.one_to_many.ClassesBean</class>
<class>com.jpa.entity.one_to_many.StudentBean</class>
<class>com.jpa.entity.one_to_one.PersonBean</class>
<class>com.jpa.entity.one_to_one.CardBean</class>
<properties>
<propertyname="javax.persistence.jdbc.driver"
value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<propertyname="javax.persistence.jdbc.url"
value="jdbc:sqlserver://localhost:1433;DatabaseName=java1411;SelectMethod=cursor;"/>
<propertyname="javax.persistence.jdbc.user" value="sa" />
<propertyname="javax.persistence.jdbc.password" value="" />
<propertyname="openjpa.jdbc.SynchronizeMappings"
value="buildSchema(ForeignKeys=true)"/>
<propertyname="openjpa.Log" value="SQL=TRACE" />
<propertyname="openjpa.ConnectionFactoryProperties"
value="PrettyPrint=true,PrettyPrintLineLength=72" />
</properties>
</persistence-unit>
</persistence>
工程中不能同时引入OpenJPA的jar与Hibernate的jar包。
9:复合主键
与Hibernate不同的注意点:
1:persistence.xml中要加入2个实体对象(ID与实体对象)
2:ID实体对象要实现hashCode与equals()方法。
<class>com.jpa.entity.ScoreBean</class>
<class>com.jpa.entity.ScoreID</class>
10:多表操作
Many_To_One
One_To_Many
尽量使用List,不用SET。SET的排序在JPA中是无序的。
One_To_One
Many_To_Many