项目碰到一个这样的需求:数据库划分为公共库、历史库、会员库和运行库。运行库可能有多个,但它们的表及表结构完全一致。一个运行库里存放着一个或多个分公司的数据。系统根据用户所属的分公司操作对应的运行库。(应用服务器是jboss 7)
方案如下:
首先,persistence.xml先配置一个模板运行库的部署单元, 这个部署单元对应的数据库必须存在。如
<persistence-unit name="XXX_RUNTIME_DS" transaction-type="JTA">
<jta-data-source>java:/XXX_RUNTIME_DS_001</jta-data-source>
...
</persistence-unit>
接下来,我们注入默认的EntityManager,我们的目标是获取默认的EntityManagerFactory,以它为模板,最终构造出我们需要的EntityManagerFactory。
@PersistenceContext(unitName = "XXX_RUNTIME_DS")
private EntityManager em;
接下来,开始构造
protected EntityManager getEntityManager() {
String db = ...;//用于判断运行库
if(db.equal(...)){//返回默认的运行库
return em;
}
//构造EntityManagerFactory
String dbStuffix = db.substring(db.indexOf(DBConstants.DB_RUNTIME_PREV) + DBConstants.DB_RUNTIME_PREV.length());//这里的值是部署单元中JNDI的_001,我们把JNDI构造成类似于java:/XXX_RUNTIME_DS_002/java:/XXX_RUNTIME_DS__003,其他类似
//覆盖某些属性
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("hibernate.cache.region.factory_class", "org.hibernate.cache.infinispan.JndiInfinispanRegionFactory");
properties.put("hibernate.cache.infinispan.cachemanager", "java:jboss/infinispan/hibernate");
properties.put("javax.persistence.jtaDataSource", DBConstants.DS_JNDI_PREV + dbStuffix);
properties.put("hibernate.session_factory_name", em.getEntityManagerFactory().getProperties().get("hibernate.session_factory_name") + dbStuffix);
properties.put("hibernate.cache.region_prefix", em.getEntityManagerFactory().getProperties().get("hibernate.cache.region_prefix") + dbStuffix);
properties.put("hibernate.ejb.entitymanager_factory_name", em.getEntityManagerFactory().getProperties().get("hibernate.ejb.entitymanager_factory_name") + dbStuffix);
//创建EntityManagerFactory
EntityManagerFactory emf = Persistence.createEntityManagerFactory("XXX_RUNTIME_DS", properties);
String puScopedName = emf.getProperties().get("hibernate.ejb.entitymanager_factory_name").toString();
//创建EntityManager
EntityManager entityManager;
boolean isInTx;
isInTx = TransactionUtil.isInTx();
if (isInTx) {
entityManager = TransactionUtil.getOrCreateTransactionScopedEntityManager(emf, puScopedName, emf.getProperties());
} else {
entityManager = NonTxEmCloser.get(puScopedName);
if (entityManager == null) {
entityManager = EntityManagerUtil.createEntityManager(emf, null);
NonTxEmCloser.add(puScopedName, entityManager);
}
}
return entityManager;
}
注:EntityManagerFactory是重量级对象,示例代码没有考虑重用,实际应该重用
分享到:
相关推荐
Spring框架为开发提供了一系列的解决方案,比如利用控制反转的核心特性,并通过依赖注入实现控制反转来实现管理对象生命周期容器化,利用面向切面编程进行声明式的事务管理,整合多种持久化技术管理数据访问,提供...
1.1.2 解决方案 1 1.1.3 工作原理 3 1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 1.3.1 问题 14 1.3.2 解决方案 14 1.3.3 ...
1.1.2 解决方案 1 1.1.3 工作原理 3 1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 1.3.1 问题 14 1.3.2 解决方案 14 1.3.3 ...
目录 1技术总述 7 2开发环境介绍 7 2.1搭建开发环境 7 2.2MyEclipse 10 3SessionBean(会话Bean) 18 3.1会话Bean调用架构 18 ...5.12.1Persistence翻页解决方案 76 6EJB事务 76 7定时器 77 8拦截器 77
为实现在异质异源数据库间的数据交换,使用户可以透明地访问数据,提出一种建立数据交换中心的解决方案。在该数据交换中心的构建中,综合采用了XML,J2EE,XSLT等技术。通过使用XML作为数据的载体,运用XSLT样式表对...
Message-Driven Bean EJB实例源代码 2个目标文件 摘要:Java源码,初学实例,EJB实例 Message-Driven Bean EJB实例源代码,演示一个接收购物订单的消息驱动Bean,处理这个订单同时通过e-mail的形式 //给客户发一个感谢...
这样也就减少了解决方案的灵活性,因为每当该数据源发生变化时,这些代码都需要改变。基层数据源的改变可能包括数据库的变化(例如从SQLServer转移到Oracle)或者整体模型的改变,如从基于JDBC的数据访问变化为通过...
Java数据对象(JDO) 概述 JDO对象模型 JDO API JDO实例的生命周期 JDO和EJB 开发可持久类 范例应用程序 配置FFJ 配置数据源 捕获数据库模式 把类映射到数据库对象 编译类 ...
2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...
特点是可以与多种数据源交互,包括文件系统,数据库,LDAP,XML资源库,网络数据源等。??免费。??ECHO:??主要应用方面:WEB层。??主要应用技术:servlet等??出处:http://www.nextapp.com/products/echo/??简述:...
2.6.1. 动态语言支持 2.6.2. 增强的测试支持 2.6.3. JMX 支持 2.6.4. 将Spring 应用程序上下文部署为JCA adapter 2.6.5. 计划任务 2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. ...
2.6.1. 动态语言支持 2.6.2. 增强的测试支持 2.6.3. JMX 支持 2.6.4. 将Spring 应用程序上下文部署为JCA adapter 2.6.5. 计划任务 2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. ...
9.9. 公共问题的解决方案 9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1....
一个开放的解决方案,可以有效地创建基于Java / Swing的客户端GUI,并将其与后端数据源和业务逻辑容器(JDBC / SQL,EJB,Hibernate ...等)紧密集成。 该库提供与Java中的Oracle Forms类似的功能。
9.9. 公共问题的解决方案 9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1....
9.9. 公共问题的解决方案 9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1. 简介 ...
Spring也许称得上是个一站式解决方案,提供了一个典型应用所需要的大部分基础架构。它还涉及到了其他framework没有考虑到的内容。 尽管它仅仅是一个从2003年2月才开始的开源项目,但Spring有深厚的历史根基。 ...