JPA总结
JPA和hibernate的关系
JPA是一种ORM规范,不是ORM框架,Hibernate是JPA的实现
JPA是使用注解
Hibernate是使用配置文件
JPA的三大技术
ORM映射元数据 xml和注解
JPA的API
JPQL查询语句
JPA快速入门
1. 新建JPA项目(2.0版本)
2. 导入hibernate.lib.require的jar包+jpa jar包+mysql驱动+hibernate包
3. 修改persistence.xml文件(连接数据库属性+配置hibernate信息+配置provider<provider>org.hibernate.ejb.HibernatePersistence</provider>)
4. 写Entity类,类上加上@Entity和@Table(name="表名") ,主键get方法上加@Id和@GeneratedValue(strategy=GenerationType.AUTO),其他字段get方法加@Column(name="字段名")
5. 添加持久化类 <class>com.jpademo1.Emp</class>
6. 编写连接代码
@Table(name="emp")
@Entity
public class Emp {
public int id;
public String name;
public int age;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public int getId() {
return id;
}
@Column(name="name")
public String getName() {
return name;
}
//创建EntityManagerFactory
String persistenceUnitname = "JPADemo"
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitname)
//创建EntityManager
EntityManager entityManager = entityManagerFactory.createEntityManager()
//开启事务
EntityTransaction transction = entityManager.getTransaction()
transction.begin()
//进行持久化操作
Emp emp = new Emp()
emp.setAge(19)
emp.setName("Still")
entityManager.persist(emp)
//提交事务
transction.commit()
//关闭资源
entityManager.close()
entityManagerFactory.close()
JPA的注解
@Entity
标注实体类再加上@Table(name="表名")
不加@Table默认类名和表名相同
@Id
在主键get方法上注解再加上@GeneratedValue(strategy=GenerationType.AUTO)。
有AUTO(默认)/IDENTITY(Oracle不支持)/SEQUENCE(Mysql不支持)/TABLE。
TABLE是将当前主键的值单独保存在一个数据库中的表中,主键的值每次都是从指定的表中查询得来。
@Basic
自动映射 字段名=属性名 没加注解的情况下默认加了@Basic。
@Column
@Colume(name="字段名",length=50,nullable="false")
@Transient
类似有对象序列化和反序列化的Transient修饰符,表示不映射,不持久化。
@Temporal
针对Date类型,设置持久化时的格式。
@Temporal(TemporalType.TIMESTAMP)
JPA API
Persistence
得到EntityManagerFactory对象
Persistence.createEntityManagerFactory(String unitName);
Persistence.createEntityManagerFactory(String unitName,Map properties);
properties是一个配置文件和之前的presistence.xml的property一致
EntityManagerFactory(类似于SessionFactory)
得到EntityManager:
createEnitiyManager();
关闭
close();
EntityManager
1. find(Class xxx.class,int i) 类似于Hibernate的get方法
2. getReference(Class xxx.class,int i) 类似于Hibernate的load方法,会有懒加载异常的问题
3. persist(T entity) 类似于Hibernate的save方法使对象持久化,但是不能有主键内容
4. testMove(T entity) 类似有Hibernate的delete方法,但是只能移除持久化对象,而不能删除游离态,必须先find找到对象后才能删除
5. merge(T entity) 类似于Hibernate的SaveOrUpdate方法,如果是一个临时对象,则会把临时对象的属性拷贝到新的对象中并持久化这个新对象,如果是一个游离对象,如果数据库中没有ID,则和临时对象一致,如果有ID,则会查询对应的记录并返回该记录对象,然后将游离对象的值复制给查询出来的对象,并更新这个查询出来的对象
6. flush() 同步持久上下文环境,将未保存的实体同步到数据库
7. refresh() 使缓存中的数据和数据库的数据同步
8. clear ():清除持久上下文环境,断开所有关联的实体。如果这时还有未提交的更新则会被撤消。
9. contains (Object entity):判断一个实例是否属于当前持久上下文环境管理的实体。
10. isOpen ():判断当前的实体管理器是否是打开状态。
11. getTransaction ():返回资源层的事务对象。EntityTransaction实例可以用于开始和提交多个事务。
12. close ():关闭实体管理器。之后若调用实体管理器实例的方法或其派生的查询对象的方法都将抛出 IllegalstateException 异常,除了getTransaction 和 isOpen方法(返回 false)。不过,当与实体管理器关联的事务处于活动状态时,调用 close 方法后持久上下文将仍处于被管理状态,直到事务完成。
EntityTransaction
EntityTransaction 接口用来管理资源层实体管理器的事务操作。通过调用实体管理器的getTransaction方法 获得其实例。
1.begin ():用于启动一个事务,此后的多个数据库操作将作为整体被提交或撤消。若这时事务已启动则会抛出 IllegalStateException 异常。
2.commit ():用于提交当前事务。即将事务启动以后的所有数据库更新操作持久化至数据库中。
3.rollback ():撤消(回滚)当前事务。即撤消事务启动后的所有数据库更新操作,从而不对数据库产生影响。
4.setRollbackOnly ():使当前事务只能被撤消。
5.getRollbackOnly ():查看当前事务是否设置了只能撤消标志。
6.isActive ():查看当前事务是否是活动的。如果返回true则不能调用begin方法,否则将抛出 IllegalStateException 异常;如果返回 false 则不能调用 commit、rollback、setRollbackOnly 及 getRollbackOnly 方法,否则将抛出 IllegalStateException 异常。多与Hibernate进行对比