使用多个数据源时Spring中存在多个实体管理器问题
我的applicationContext.xml
有两个实体管理器,它们对应两个不同的数据库。 我可以使用entityManager1
轻松查询database1
,但是当我尝试使用entityManager2
访问database2
时,我没有得到任何结果。 我正在使用Spring + Hibernate + JPA。
这是我的ApplicationContext.xml
characterEncoding UTF-8 characterEncoding UTF-8 classpath*:META-INF/persistence.xml classpath*:META-INF/persistence2.xml
这是我的服务层代码,可以与enityManager1
一起enityManager1
:
@Transactional public class StatesDAO implements IStatesDAO { private EntityManager em; @PersistenceContext(unitName = "PU1") public void setEntityManager(EntityManager em) { this.em = em; } private EntityManager getEntityManager() { return em; } @SuppressWarnings("unchecked") public List findAll() { logger.info("finding all States instances"); try { final String queryString = "select model from States model"; Query query = getEntityManager().createQuery(queryString); return query.getResultList(); } catch (RuntimeException re) { throw re; } } }
我的两个persitence.xml
文件如下所示:
org.hibernate.ejb.HibernatePersistence com.jpa.entity.States
和
org.hibernate.ejb.HibernatePersistence com.jpa.other.entity.States
如果我更改了我的服务层(如下所示),我没有得到任何结果。 基本上列表的大小为零:
@Transactional public class StatesDAO implements IStatesDAO { private EntityManager em; @PersistenceContext(unitName = "PU2") public void setEntityManager(EntityManager em) { this.em = em; } private EntityManager getEntityManager() { return em; } @SuppressWarnings("unchecked") public List findAll() { logger.info("finding all States instances"); try { final String queryString = "select model from States model"; Query query = getEntityManager().createQuery(queryString); return query.getResultList(); } catch (RuntimeException re) { throw re; } } }
所以基本上你可以看到我有两个具有完全相同结构的实体(状态),为了区分彼此,我将它们放入单独的包中
根据我的知识,我在这里没有做任何疯狂的事情,但它仍然没有起作用。 这个问题是怎么造成的,怎么解决这个问题?
后续行动:我忘了提到的一件事是即使有两个不同的数据库,但数据库服务器名称是相同的。 我不知道这是否是一个有用的信息。所以想到分享它。
这是我现在得到的例外:
16:24:44,732 INFO [STDOUT] Hibernate: select state0_.state as col_0_0_ from states state0_ 16:24:44,753 WARN [JDBCExceptionReporter] SQL Warning: 36106, SQLState: 01I01 16:24:44,753 WARN [JDBCExceptionReporter] IDS SQL Warning: SQLCODE=36106, SQLSTATE=01I01, SQLERRMC=0;819;informix;;IDS/NT32;1;1;0;819;0;, DRIVER=4.7.85
我遇到了同样的问题,但是有多个Hibernate会话工厂:2个具有相同结构的DB,我不想拥有2个相同的DAO集等等。虽然我的经验是Hibernate,但我怀疑你可以使用相同的解决方案:Spring的AbstractRoutingDataSource
。 它允许您配置应用程序,以便在运行时根据ThreadLocal
上设置的值确定要使用的数据源。 有关介绍,请参见http://blog.springsource.com/2007/01/23/dynamic-datasource-routing/ 。 最终发生的事情是,工厂中的dataSource
引用不会指向硬编码的dataSource
bean,而是指向AbstractRoutingDataSource
。 要设置每个线程的切换,请使用@Aspect确定要触发的数据库。
- DAO和dependency injection,建议?
- 如何使用Hibernate Context会话创建Generic DAO类
- EntityManager注入 – NullPointerException
- 测试DAO时出错:sun.reflect.generics.reflectiveObjects.TypeVariableImpl无法强制转换为java.lang.Class
- Spring + Hibernate:具有相同标识符值的不同对象已与会话关联
- 两个类内部几乎重复的代码
- java.lang.IllegalArgumentException“无法使用Spring 4和Hibernate 4设置DAO字段”
- 服务和DAO层的责任和使用
- spring – 如何自动连接数据源?