持久化单元,持久化对象的集合。
事务类型:本地事务和全局事务。某些应用场合,只能使用全局事务。
有两个数据库,mysql和oracle.转账时扣钱从mysql进行,加钱是在oracle执行,怎样确保两个语句在同一个事务中执行。普通JDBC不能,只能用全局事务。事务的生命周期应该从Connection对象中抽取出来,不应该局限在Connection中。通常由容器(WebLogic,JBoss)提供JTA实现。二次提交协议,执行一条语句预提交到数据库,执行结果保存到某个变量中,再执行另一条语句,如果都成功,再进行第二次提交。
类路径下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/persistencehttp://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
<persistence-unit name="jpaPU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<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.username" value="root"/>
<property name="hibernate.connection.password" value="123456"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/hib?useUnicode=true&characterEncoding=UTF-8"/>
<property name="hibernate.max_fetch_depth" value="3"/>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
</properties>
</persistence-unit>
</persistence>
这里使用的是Hibernate的JPA实现。不同的JPA产品properties属性配置是不同的。
create-drop的意思是sessionFactory加载时创建表,销毁时删除。
自定义封装类产生EntityManager
package com.tazi.domin;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public final class JpaUtils {
private static EntityManagerFactory emf;
static{
emf=Persistence.createEntityManagerFactory("jpaPU"); //靠provider实现,这里的provider是org.hibernate.ejb.HibernatePersistence
System.out.println(emf.getClass().getName());//org.hibernate.ejb.EntityManagerFactoryImpl
}
public static EntityManager getEntityManager(){
EntityManager em=emf.createEntityManager();
System.out.println(em.getClass().getName());//org.hibernate.ejb.EntityManagerImpl
return em;
}
}
例子:实体类Person
package com.tazi.domin;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Person {
@Id
@GeneratedValue
private Integer id;
private String name;
private Date birthday;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
测试:
package com.tazi.domin;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
public class Test1 {
public static void main(String[] args) {
Person person=new Person();
person.setName("tazi");
EntityManager em=null;
EntityTransaction tx=null;
try{
em=JpaUtils.getEntityManager();
tx=em.getTransaction();
em.persist(person);
tx.begin();
tx.commit();
}finally{
if(em!=null){
em.close();
}
}
}
}
这里的方法名都是JPA API,但其实实现是由Hibernate实现的。也就是底层其实是sessionFactory和session的操作。
JPA里面