spring mvc jpa中配置了entityManagerFactory后怎样连接多个数据库并将每个实体分别映射到对应的库里

玄水居士 2016-11-02 10:19:02
原先单个库的配置如下:

<context:property-placeholder location="classpath*:/db.properties" />

<context:annotation-config />

<bean
class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />

<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource"
destroy-method="close">
<property name="driverClass" value="${database.driver}" />
<property name="jdbcUrl" value="${database.url}" />
<property name="username" value="${database.username}" />
<property name="password" value="${database.password}" />
<property name="idleConnectionTestPeriod" value="60" />
<property name="idleMaxAge" value="240" />
<property name="maxConnectionsPerPartition" value="10" />
<property name="minConnectionsPerPartition" value="5" />
<property name="partitionCount" value="3" />
<property name="acquireIncrement" value="2" />
<property name="statementsCacheSize" value="50" />
<property name="releaseHelperThreads" value="3" />
<property name="connectionTestStatement">
<value>select sysdate from dual</value>
</property>
</bean>

<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="zUnit" />
<property name="packagesToScan" value="com.hzzykj.z.entity.*" />
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="databasePlatform" value="${database.platform}" />
<property name="generateDdl" value="${database.generateDdl}" />
<property name="showSql" value="${database.showSql}" />
</bean>
</property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<bean id="tManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>

<bean id="transactionTemplate"
class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="tManager" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 事务执行方式 REQUIRED:指定当前方法必需在事务环境中运行, 如果当前有事务环境就加入当前正在执行的事务环境, 如果当前没有事务,就新建一个事务。 -->
<tx:method name="create*" propagation="REQUIRED" />
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="remove*" propagation="REQUIRED" />
<tx:method name="del*" propagation="REQUIRED" />
<tx:method name="import*" propagation="REQUIRED" />
<!-- 指定当前方法以非事务方式执行操作,如果当前存在事务,就把当前事务挂起,等我以非事务的状态运行完,再继续原来的事务。 -->
<tx:method name="*" propagation="NOT_SUPPORTED" read-only="true" />
</tx:attributes>
</tx:advice>

<aop:config>
<!-- 切入点 -->
<aop:pointcut id="daoPointcut" expression="execution(* com.hzzykj.z.dao..*.*(..))" />
<aop:pointcut id="servicePointcut"
expression="execution(* com.hzzykj.z.service..*.*(..))" />
<aop:pointcut id="ctlPointcut" expression="execution(* com.hzzykj.z.web..*.*(..))" />

<aop:advisor advice-ref="txAdvice" pointcut-ref="daoPointcut" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="servicePointcut" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="ctlPointcut" />
</aop:config>

<context:component-scan base-package="com.hzzykj.z.dao.*" />
<context:component-scan base-package="com.hzzykj.z.service.*" />



在dao层中通过以下方式注入entityManager

@PersistenceContext(name = "entityManagerFactory")
protected EntityManager entityManager;

public EntityManager getEntityManager() {
return this.entityManager;
}

public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}


实体如下配置注解:


@Entity
@Table(name = "T_System_User")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class User extends BaseHierarchyEntity<User>



现在的问题是我要连接多个数据库并且把定义的实体分别映射到对应的库中,之前网上也找了很多方法,有的是用动态数据源切换的,也有的是配置多个entityManagerFactory的,但是试过后发现,定义的实体会在每个库里进行映射,但我希望的是某几个实体只映射到其中一个数据库里,另外的实体映射到另外的数据库里,两者之间的dao操作可以互不影响
...全文
1052 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Gleam的博客 2017-12-19
  • 打赏
  • 举报
回复
这个问题有人解决了吗 现在遇到的问题跟你一样。之前有一个服务配置的是LocalContainerEntityManagerFactoryBean,我们本来是pg的数据库,现在要把部分数据,写到第三方的oracle 的一张表里面。两边的数据库本来就不同。我新写了一个实体,但是我这边LocalContainerEntityManagerFactoryBean老是去注入我新写的实体。然后启动就失败了。试了上面的朋友,加上packagesToScan这个属性还是不行。
hello_doctor 2017-01-05
  • 打赏
  • 举报
回复
兄弟,你这个问题解决了吗?我现在遇到的问题跟你一样。之前有一个服务配置的是LocalContainerEntityManagerFactoryBean,我们本来是pg的数据库,现在要把部分数据,写到第三方的oracle 的一张表里面。两边的数据库本来就不同。我新写了一个实体,但是我这边LocalContainerEntityManagerFactoryBean老是去注入我新写的实体。然后启动就失败了。试了上面的朋友,加上packagesToScan这个属性还是不行。
X元素 2016-11-03
  • 打赏
  • 举报
回复
引用 2 楼 xuanshuijushi 的回复:
试过啊,但是要么就是entityManager注入失败 要么就是两个库里都映射了所有的实体
定义不同的dataSorce ,指向不同的entity, 不会错的。
玄水居士 2016-11-03
  • 打赏
  • 举报
回复
试过啊,但是要么就是entityManager注入失败 要么就是两个库里都映射了所有的实体
X元素 2016-11-02
  • 打赏
  • 举报
回复
        
        <property name="packagesToScan" value="com.hzzykj.z.entity.*" />
        <property name="dataSource" ref="dataSource" />
看看这。

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧