在src/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/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> <persistence-unit name="ApplicationEntityManager" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> </persistence-unit> </persistence>
在Spring的配置文件applicationContext.xml中添加
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property> <property name="url"><value>jdbc:mysql://localhost/sw?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8</value></property> <property name="username"><value>root</value></property> <property name="password"><value>mysql</value></property> </bean> <!-- JPA EntityManagerFactoryBean for EntityManager--> <bean id="myEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="showSql" value="true" /> <property name="generateDdl" value="true" /> </bean> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="myEntityManagerFactory"/> <property name="dataSource" ref="dataSource"/> </bean> <tx:annotation-driven transaction-manager="transactionManager"/>
这不是唯一一种写法,网络上提供的方法可谓千差万别,我试过大多可用。
建议详读LocalContainerEntityManagerFactoryBean的API文档
GenericDaoJpa.java
package net.sw.base.dao.jpa;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityNotFoundException;
import net.sw.base.dao.GenericDao;
import net.sw.base.domain.BaseDomain;
import net.sw.util.PKgen;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.orm.jpa.support.JpaDaoSupport;
import org.springframework.transaction.annotation.Transactional;
/**
* 这个类是所有 DAO 的基类,所有DAO必须继承这个类
*
*
* @author vyyv
* @param <T> 对象类名
*
* @param <PK> 对象主键(ID)的类型
*
*/
@Transactional
public class GenericDaoJpa<T extends BaseDomain, PK extends Serializable> extends JpaDaoSupport implements
GenericDao<T, PK> {
/**
* 日志文件使用方法 LogFactory.getLog(getClass())
* 来源 Commons Logging
*/
protected final Log log = LogFactory.getLog(getClass());
private Class<T> persistentClass;
/**
*{@inheritDoc}
*
*/
public GenericDaoJpa(final Class<T> persistentClass) {
this.persistentClass = persistentClass;
}
/**
* {@inheritDoc}
*/
@SuppressWarnings("unchecked")
public List<T> getAll() {
return getJpaTemplate().find(
"from " + this.persistentClass.getName());
}
/**
* {@inheritDoc}
*/
public T get(PK id) {
T entity = getJpaTemplate().find(this.persistentClass, id);
if (entity == null) {
String msg = "Uh oh, '" + this.persistentClass
+ "' object with id '" + id + "' not found...";
log.warn(msg);
throw new EntityNotFoundException(msg);
}
return entity;
}
/**
* {@inheritDoc}
*/
public boolean exists(PK id) {
T entity = getJpaTemplate().find(this.persistentClass, id);
return entity != null;
}
/**
* {@inheritDoc}
*/
public T save(T object) {
if (object.getId()==0) {
object.setId(PKgen.getInstance(0).nextPK());
object.setCreatetime(new Date());
getJpaTemplate().persist(object);
}else{
getJpaTemplate().merge(object);
}
return object;
}
/**
* {@inheritDoc}
*/
public void remove(PK id) {
getJpaTemplate().remove(this.get(id));
}
}
注意第88行,一般我们应该在构造方法中添加ID、CreateTime,但是由Flex生成并传递过来的对象不会走Java的构造方法,所以我改在这里添加。
AlbumDaoJpa.java
package net.sw.album.dao.jpa;
import java.util.Date;
import net.sw.album.domain.Album;
import net.sw.album.dao.AlbumDao;
import net.sw.base.dao.jpa.GenericDaoJpa;
import net.sw.util.PKgen;
import org.springframework.transaction.annotation.Transactional;
/**
* 相册数据访问实现
*
* @author vyyv
*
*/
//@Repository("albumDao")
@Transactional
public class AlbumDaoJpa extends GenericDaoJpa<Album,Long> implements AlbumDao {
public AlbumDaoJpa() {
super(Album.class);
}
}
@Transactional必须要标注,如果缺少事务,JPA将不能提交数据。