Hibernate:在同一个应用程序中使用两个不同的DataBase模式
上下文
我正在创建一个数据库环境,我想在几个不同的模式中拆分数据,以便用于不同的用户组。 虽然,由于它包含公共实体,因此应该向每个人共享其中一个数据库。
假设数据库:
- DB1 – 通用实体;
- 车轮实体
- DB2 – 组“A”;
- 汽车实体
- DB3 – 组“B”;
- 摩托车实体
我有三个不同的项目:
- 项目1:
- 车轮豆
- 项目2:
- 汽车制造商
- 项目3:
- 摩托车构造函数
问题
我正试图从项目/模式(2,“A”)和(3,“B”)访问轮子(项目1)
第一个问题:有可能吗? 第二:我该怎么办?
项目2中的hibernate.cfg.xml
配置为
jdbc:mysql://99.999.999.99:3306/DB2
这必然会限制与DB2的所有连接,或者有另一种方法来添加新连接或使用3306端口或至少DB1中的所有数据库?
从项目2中的 project1映射实体似乎也不会成功,例如:
组态
- Eclipse Indigo
- MySql 5.5
- Hibernate 3.0(通过xml而不是注释进行映射)
- 赢7
谢谢你的帮助!
您可以使用@Table(catalog="")
指定它们所属的数据库,然后还可以跨数据库建立关系。
在您的情况下, Wheel
使用catalog属性映射到DB1, Car
到DB2和MotorCycle
到DB3。
我已经使用MySQL和MSSQL的这个解决方案,并且工作得很好。 只有约束这三个数据库必须在同一个数据库服务器中,用于访问数据库的用户应该拥有对所有数据库的适当权限。
因为此解决方案只是在所有查询中针对表添加模式名称。
我会将我的项目分成多个自我持续的项目。 Wheel项目将是一个自给自足的项目,负责Wheel实体。
项目1:Wheel此项目将定义Hibernate实体和DAO以访问/修改车轮定义。 另外,我将在此项目中配置一个指向DB1的单独数据源。 实体类:
@Entity public class Wheel { }
DAO课程:
@Repository public class WheelDAO { @Persistence private EntityManager em; }
基本上,这个想法是在DAO级别分离应用程序。 并在服务级别管理交易。 成像WheelDAO(连接到DB1数据源)和CarDAO(连接到DB2数据源)并将它们注入CarService。
DB1 DB2 DB2 | | | WheelDAO CarDAO MotorcycleDAO \_____________/ | \_____|__________________________/ | | | | CarService MotorCycleService
我建议使用Spring作为IOC容器来管理这些依赖。 虽然你也可以不使用Spring来实现这一点。
您需要的只是一个数据库连接工厂,它允许您在需要时使用所需的数据库。
请查看下面的课程,您可以根据该课程来解决您的问题
import java.net.URL; import java.util.HashMap; import javax.security.auth.login.Configuration; public class HibernateUtil { private static Log log = LogFactory.getLog(HibernateUtil.class); private static HashMap sessionFactoryMap = new HashMap(); public static final ThreadLocal sessionMapsThreadLocal = new ThreadLocal(); public static Session currentSession(String key) throws HibernateException { HashMap sessionMaps = (HashMap) sessionMapsThreadLocal.get(); if(sessionMaps == null) { sessionMaps = new HashMap(); sessionMapsThreadLocal.set(sessionMaps); } // Open a new Session, if this Thread has none yet Session s = (Session) sessionMaps.get(key); if(s == null) { s = ((SessionFactory) sessionFactoryMap.get(key)).openSession(); sessionMaps.put(key, s); } return s; } public static Session currentSession() throws HibernateException { return currentSession(""); } public static void closeSessions() throws HibernateException { HashMap sessionMaps = (HashMap) sessionMapsThreadLocal.get(); sessionMapsThreadLocal.set(null); if(sessionMaps != null) { for(Session session : sessionMaps.values()) { if(session.isOpen()) session.close(); } ; } } public static void closeSession() { HashMap sessionMaps = (HashMap) sessionMapsThreadLocal.get(); sessionMapsThreadLocal.set(null); if(sessionMaps != null) { Session session = sessionMaps.get(""); if(session != null && session.isOpen()) session.close(); } } public static void buildSessionFactories(HashMap configs) { try { // Create the SessionFactory for(String key : configs.keySet()) { URL url = HibernateUtil.class.getResource(configs.get(key)); SessionFactory sessionFactory = new Configuration().configure(url).buildSessionFactory(); sessionFactoryMap.put(key, sessionFactory); } } catch(Exception ex) { ex.printStackTrace(System.out); log.error("Initial SessionFactory creation failed.", ex); throw new ExceptionInInitializerError(ex); } // end of the try - catch block } public static void buildSessionFactory(String key, String path) { try { // Create the SessionFactory URL url = HibernateUtil.class.getResource(path); SessionFactory sessionFactory = new Configuration().configure(url).buildSessionFactory(); sessionFactoryMap.put(key, sessionFactory); } catch(Throwable ex) { log.error("Initial SessionFactory creation failed.", ex); throw new ExceptionInInitializerError(ex); } // end of the try - catch block } public static void closeSession(String key) { HashMap sessionMaps = (HashMap) sessionMapsThreadLocal.get(); if(sessionMaps != null) { Session session = sessionMaps.get(key); if(session != null && session.isOpen()) session.close(); } } } // end of the class
- 有关IntelliJ到Eclipse转换的问题
- Java项目。 JspWriter的问题
- 在Eclipse中调试Java时如何使getResourceAsStream工作?
- 原始服务器没有找到目标资源的当前表示,或者不愿意透露存在该目标资源。 在部署到tomcat
- 在null-reference上创建方法引用不会引发exception
- 在android中有效地绘制正弦波
- Android Tab Fragment(Eclipse ApI 22)中不推荐使用ActionBarActivity和ActionBar.TabListener
- 什么是差异。 default.properties和project.properties之间?
- 导入的maven项目不会显示为java项目。 显示文件夹