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 

http://www.java-forums.org/