Spring Hibernate整合要点之JPA

2010年5月21日 由 yybean 留言 »
一、依赖包
Jar From
spring.jar Sping 2.5
antlr.jar Hibernate Core
asm.jar Hibernate Core
asm-attrs.jar Hibernate Core
cglib.jar Hibernate Core
dom4j.jar Hibernate Core
jdbc2_0-stdext.jar Hibernate Core
ehcache.jar Hibernate Core
hibernate3.jar Hibernate Core
xml-apis.jar Hibernate Core
commons-collections.jar Hibernate Core
ejb3-persistence.jar Hibernate Annotations
jta.jar Hibernate Annotations
hibernate-annotations.jar Hibernate Annotations
hibernate-entitymanager.jar Hibernate Entity Manager
javassist.jar Hibernate Entity Manager
jboss-archive-browsing.jar Hibernate Entity Manager

注意:Hibernate Annotations和Hibernate Entity Manager需要在Hibernate的主页上下载,不包括在Core里面

 

二、注解实体

@Entity

一个例子:

package com.yybean.domain;

 

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

import javax.persistence.Table;

 

import org.springframework.stereotype.Component;

 

 

 

/**

 * Person entity. @author MyEclipse Persistence Tools

 */

@Entity

@Table(name="person")

public class Person  {

 

 

    // Fields    

     @Id    

     @GeneratedValue(strategy=GenerationType.IDENTITY)

     private Integer id;

     

 

     private String name;

     

 

     private Integer age;

     

 

     private String address;

     

     @Column(name="dept_id")

     private Integer deptId;

 

 

    // Constructors

 

    /** default constructor */

    public Person() {

    }

 

    

    /** full constructor */

    public Person(String name, Integer age, String address, Integer deptId) {

        this.name = name;

        this.age = age;

        this.address = address;

        this.deptId = deptId;

    }

 

   

    // Property accessors

 

    public Integer getId() {

        return this.id;

    }

    

    public void setId(Integer id) {

        this.id = id;

    }

 

    public String getName() {

        return this.name;

    }

    

    public void setName(String name) {

        this.name = name;

    }

 

    public Integer getAge() {

        return this.age;

    }

    

    public void setAge(Integer age) {

        this.age = age;

    }

 

    public String getAddress() {

        return this.address;

    }

    

    public void setAddress(String address) {

        this.address = address;

    }

 

    public Integer getDeptId() {

        return this.deptId;

    }

    

    public void setDeptId(Integer deptId) {

        this.deptId = deptId;

    }

@Entity让JPA服务Provider知道这个类可以被持久化,其他的具体参照JPA批注参考

三.DAO实现

主要是用EntityManager来操作

使用EntityManager操作实体

主要是

C

EntityManager类中的persist方法可以在数据库中添加一条记录,其声明如下所示。

public void persist(Object entity)

R

   r1 :EntityManager类中的find方法可以根据主键的值查找对应的实体。

   public <T> T find(Class <T> entityClass, Object primaryKey);

   r2:EntityManager类中的createQuery方法可以查询数据,并返回查询结果集,其声明如下所示。

   public Query createQuery(String queryString);

U

EntityManager类中的merge方法可以将实体更新到数据库中,其声明如下所示。

public <T> T merge(T entity);

D

EntityManager类中的remove方法可以删除数据库中的一条记录,其声明如下所示。

public void remove(Object entity);

一个例子

package com.persistence.daoImpl;

 

import java.util.List;

 

import javax.persistence.EntityManager;

import javax.persistence.PersistenceContext;

 

import org.springframework.stereotype.Repository;

 

import yy.domain.Person;

 

@Repository

public class PersonDAO {

    

    @PersistenceContext

    private EntityManager em;

    

    @SuppressWarnings("unchecked")

    public List<Person> findAll()

    {

        String ql = "from Person p";

        return  em.createQuery(ql).getResultList();

    }

 

    public void save(Person p)

    {

        em.persist(p);

    }

}

@PersistenceContext会让Spring在实例化的时候给服务注入一个EntityManager。@PersistenceContext注解可以放在实例变量,或者setter方法前面

 

四.JPA配置
  1. 在"src"目录下创建一个"META-INF"目录
  2. 在"META-INF"目录下创建一个名为"persistence.xml"的文件。

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/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"

    version="1.0">  

 

    <!-- JPA的ibernate本地事务实现配置-->

    <persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">

        <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <properties>

            <property name="hibernate.connection.driver_class"

                value="com.mysql.jdbc.Driver" /> 

            <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/tt" />

            <property name="hibernate.connection.username" value="yybean"/>

            <property name="hibernate.connection.password" value="123456"/>

            <property name="hibernate.show_sql" value="true"/>

            <property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect"/>

            <property name="hibernate.current_session_context_class" value="thread"/>

            <property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider" />

        </properties>

    </persistence-unit>

    

</persistence>

如果是定义了数据池,那么<property name="hibernate.connection.url"  等等数据库配置的属性可以不写,like this

<?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/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"

    version="1.0">

 

    <persistence-unit name="persistenceUnit"

        transaction-type="RESOURCE_LOCAL">

        <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <properties>

            <property name="hibernate.show_sql" value="true" />

            <property name="hibernate.hbm2ddl.auto" value="update" />

        </properties>

    </persistence-unit>

</persistence>

五.spring配置

applicationContext.xml关键部分

<!-- JPA EntityManagerFactoryBean for EntityManager-->

   <bean id="entityManagerFactory"

       class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">

       <property name="persistenceUnitName" value="persistenceUnit" />

       <property name="dataSource" ref="dataSource" />

   </bean>

   

   <!-- Transaction manager for JPA -->

   <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">

      <property name="entityManagerFactory"><ref bean="entityManagerFactory"/></property>

   </bean>        

注意persistenceUnitName要跟persistence.xml里面定义的一样。

如果数据库配置是在persistence.xml中的,去掉<property name="dataSource" ref="dataSource" />即可

 

六,修改web.xml

增加过滤器

<filter>

        <filter-name>OpenEntityManagerInViewFilter</filter-name>

        <filter-class>

            org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter

        </filter-class>

    </filter>

 

    <filter-mapping>

        <filter-name>OpenEntityManagerInViewFilter</filter-name>

        <url-pattern>/*</url-pattern>

    </filter-mapping>

跟懒加载有关,如果之前不是用jpa整合的话,可能用的是OpenSessionInViewFilter,这里得去掉

 

thanks:

http://neil-jh.javaeye.com/blog/235306

http://www.albertsong.com/read-131.html





发表评论