以下是典型的persistence.xml---持久化单元
com.habuma.spitter.domain.Spitter com.habuma.spitter.domain.Spittle
2、使用容器管理类型的JPA: <常用的方式>
下是Spring提供的多个JPA提供商
EclipseLinkJpaVendorAdapter
HibernateJpaVendorAdapter
OpenJpaVendorAdapter
TopLinkJpaVendorAdapter
IBM DB2 DB2 Apache Derby DERBY H2 H2 Hypersonic HSQL INFORMIX INFORMIX MYSQL MYSQL Oracle ORACLE PostgresQL POSTGRESQL Microsoft SQL Server SQLSERVER Sybase SYBASE
如果服务器中已经创建好了EntityManagerFactory,可以通过JNDI查找:
编写基于JPA的DAO:
Spring也对jpa集成提供了JpaTemplate模板,以及对应的dao支持JpaDaoSupport,但是为了提供更纯粹的JPA方式,基于模板的JPA已经弃用了。
鉴于纯粹的JPA方式远胜于基于模板的JPA,所以本章重点关注如何构建不使用Spring的JPA DAO。
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import com.habuma.spitter.domain.Spitter;
import com.habuma.spitter.domain.Spittle;
@Repository("spitterDao") //捕获异常
@Transactional //事物管理
public classJpaSpitterDaoimplementsSpitterDao{
private static final String RECENT_SPITTLES= "SELECTsFROMSpittles";
private static final String ALL_SPITTERS= "SELECTsFROMSpitters";
private static final String SPITTER_FOR_USERNAME= "SELECTsFROMSpittersWHEREs.username=:username";
private static final String SPITTLES_BY_USERNAME= "SELECTsFROMSpittlesWHEREs.spitter.username=:username";
@PersistenceContext //注入EntityManager em
private EntityManager em;
public voidaddSpitter(Spitter spitter){
em.persist(spitter);
}
public SpittergetSpitterById(long id){
returnem.find(Spitter.class,id);
}
public voidsaveSpitter(Spitter spitter){
em.merge(spitter); //更新
}
...
}