微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 使用多个数据源时Spring中的多个实体管理器问题

我的applicationContext.xml中有两个实体管理器,它们对应两个不同的数据库.我可以使用entityManager1轻松查询database1,但是当我尝试使用entityManager2访问database2时,我没有得到任何结果.我正在使用Spring Hibernate JPA.

这是我的ApplicationContext.xml

    spring-beans-2.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

 factorybean">
  vendorAdapter">
   vendor.HibernateJpavendorAdapter">
    sql" value="true" />
   factorybean">
  vendorAdapter">
   vendor.HibernateJpavendorAdapter">
    sql" value="true" />
   fig.MethodInvokingfactorybean"
  lazy-init="false">
  etobject" ref="dataSource" />
  getmethod" value="addConnectionProperty" />
  aracterEncodingfig.MethodInvokingfactorybean"
  lazy-init="false">
  etobject" ref="dataSource2" />
  getmethod" value="addConnectionProperty" />
  aracterEncodingcope="prototype">
  sspath*:meta-inf/persistence.xmlsspath*:meta-inf/persistence2.xml

这是我的服务层代码,可以与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 Listcreatequery(queryString);
   return query.getResultList();

  } catch (RuntimeException re) {
   throw re;
  }

 }

    }

我的两个persitence.xml文件如下所示:

persistence-unit name="PU1" transaction-type="RESOURCE_LOCAL">
  persistence-unit>

persistence-unit name="PU2" transaction-type="RESOURCE_LOCAL">
  persistence-unit>

如果我更改了我的服务层(如下所示),我没有得到任何结果.基本上列表的大小为零:

@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 Listcreatequery(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确定要命中的数据库.

原文地址:https://www.jb51.cc/spring/432662.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐