一、依赖包
| 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来操作
主要是
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配置
- 在"src"目录下创建一个"META-INF"目录
- 在"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