package org.easyframe.enterprise.spring;
import java.util.Collections;
import javax.annotation.PostConstruct;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import jef.database.ManagedTransactionImpl;
import jef.database.Session;
import jef.database.jpa.JefEntityManager;
import jef.database.jpa.JefEntityManagerFactory;
import jef.tools.Assert;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.ConnectionHolder;
import org.springframework.orm.jpa.EntityManagerFactoryUtils;
import org.springframework.transaction.support.TransactionSynchronizationManager;
/**
* 所有DAO的基类
* @author jiyi
*
*/
public class BaseDao {
@Autowired
private EntityManagerFactory entityManagerFactory;
private JefEntityManagerFactory jefEmf;
@PostConstruct
public void init(){
Assert.notNull(entityManagerFactory);
if(jefEmf==null){
jefEmf=(JefEntityManagerFactory)entityManagerFactory;
}
}
/**
* 获得EntityManager
* @return
*/
protected final EntityManager getEntityManager(){
TransactionMode tx=jefEmf.getDefault().getTxType();
EntityManager em;
switch (tx) {
case JPA:
case JTA:
em=EntityManagerFactoryUtils.doGetTransactionalEntityManager(entityManagerFactory,null);
if(em==null){ //当无事务时。Spring返回null
em=entityManagerFactory.createEntityManager(null,Collections.EMPTY_MAP);
}
break;
case JDBC:
ConnectionHolder conn=(ConnectionHolder)TransactionSynchronizationManager.getResource(jefEmf.getDefault().getDataSource());
if(conn==null){//基于数据源的Spring事务
em=entityManagerFactory.createEntityManager(null,Collections.EMPTY_MAP);
}else{
ManagedTransactionImpl session=new ManagedTransactionImpl(jefEmf.getDefault(),conn.getConnection());
em= new JefEntityManager(entityManagerFactory,null,session);
}
break;
default:
throw new UnsupportedOperationException(tx.name());
}
return em;
}
/**
* 获得JEF的操作Session
* @return
*/
public Session getSession() {
JefEntityManager em=(JefEntityManager)getEntityManager();
Session session= em.getSession();
Assert.notNull(session);
return session;
}
/**
* 获得JEF的操作Session
* @return
*/
public Session getNonTransactionalSession() {
return jefEmf.getDefault();
}
/**
* 获得JEF的操作Session
* @deprecated use method {@link #getSession()} instead.
* @return
*/
protected final Session getDbClient(){
return getSession();
}
public void setEntityManagerFactory(EntityManagerFactory entityManagerFactory) {
Assert.notNull(entityManagerFactory);
this.entityManagerFactory = entityManagerFactory;
this.jefEmf=(JefEntityManagerFactory)entityManagerFactory;
}
}