JPA

来源:互联网 发布:网络课程尔雅官网 编辑:程序博客网 时间:2024/06/06 09:57

JPA DOC

JPA简介

JPA(Java Persistence API)是JDK5定义的一组对象和数据库关系(ORM)的规范。
其是对ORM的规范定义,就想JDBC规范一样,没有实现,实现由各个数据库的驱动来实现,JPA的实现产品有Hibernate、OpenLink等。

JPA Hello Word

本例使用hibernate作为JPA实现来进行操作。
使用eclipse作为IDE来建立JAP项目。

建立JPA项目

这里写图片描述
本例选择JPA2.0。
将会在项目的src/META-INF下建立persistence.xml文件,此文件也是JPA必要配置文件。
配置如下:

<?xml version="1.0" encoding="UTF-8"?><persistence version="2.0"    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_2_0.xsd">    <persistence-unit name="MJPA" transaction-type="RESOURCE_LOCAL">        <provider>org.hibernate.ejb.HibernatePersistence</provider>        <class>org.pretent.model.User</class>        <class>org.pretent.model.Order</class>        <class>org.pretent.model.Role</class>        <properties>            <property name="hibernate.connection.username" value="root" />            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />            <property name="hibernate.connection.password" value="mysqladmin" />            <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/jpa" />            <property name="hibernate.hbm2ddl.auto" value="update" />            <property name="hibernate.show_sql" value="true" />            <property name="hibernate.format_sql" value="true" />        </properties>    </persistence-unit></persistence>

编写实体类Entity

package org.pretent.entity;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.Table;@Entity@Table(name = "T_ORDER")public class Order {    @Id    @GeneratedValue    private Integer id;    @Column    private String name;    // getter / setter}

新增记录

@Testpublic void testJPA() {    // persistence-unit 节点的name属性    EntityManagerFactory facatory = Persistence.createEntityManagerFactory("MJPA");    EntityManager entityManager = facatory.createEntityManager();    EntityTransaction transaction = entityManager.getTransaction();    transaction.begin();    Order order = new Order();    order.setName("test_order");    entityManager.persist(order);    transaction.commit();    entityManager.close();    facatory.close();}

缓存

需要JPA实现产品支持,hibernate支持一级缓存和二级缓存。

一级缓存

session级别(entityManager)的缓存,同一session不关闭,查询一个对象第二次使用缓存对象。

Order order = entityManager.find(Order.class, 1);Order orde1 = entityManager.find(Order.class, 1);

同一个entityManager查询两次同一个对象,只发送一次sql查询语句。
如果在多个session中查询同一对象,就会发送多次查询请求:

Order order = entityManager.find(Order.class, 1);entityManager.close();entityManager = facatory.createEntityManager();Order orde1 = entityManager.find(Order.class, 1);

二级缓存

persistence.xml 加入缓存配置

<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode><properties>    <!-- ... -->                <property name="hibernate.cache.use_second_level_cache" value="true"/>    <property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/>    <property name="hibernate.cache.use_query_cache" value="true"/></properties>

shared-cache-mode缓存模式:

ALL:所有实体都会被缓存NONE:所有实体都不缓存DISABLE_SELECTIVE:配置了@Cacheable(false)以外的的entity都会被缓存ENABLE_SELECTIVE:配置了@Cacheable(true)的entity都会被缓存

加入Ehcache缓存jar包和Ehcache配置文件ehcache.xml到src中

entity 加入缓存注解@Cacheable(true)

@Entity@Table(name = "T_ORDER")@Cacheable(true)public class Order implements Serializable {}

当再在多个session中查询同一个对象时,就发送一次查询请求:

Order order = entityManager.find(Order.class, 1);entityManager.close();entityManager = facatory.createEntityManager();Order orde1 = entityManager.find(Order.class, 1);

查询缓存
查询缓存至需要如下配置(与@Cacheable(true)和shared-cache-mode没有关系):

<property name="hibernate.cache.use_query_cache" value="true"/>
EntityManager entityManager = facatory.createEntityManager();Query query = entityManager.createNativeQuery("SELECT * FROM t_order");query.setHint(QueryHints.HINT_CACHEABLE, true);System.out.println(query.getResultList());entityManager.close();entityManager = facatory.createEntityManager();Query query1 = entityManager.createNativeQuery("SELECT * FROM t_order");query1.setHint(QueryHints.HINT_CACHEABLE, true);System.out.println(query1.getResultList());
0 0