Hibernate:在同一个应用程序中使用两个不同的DataBase模式

时间:2012-12-14 11:23:57

标签: java mysql eclipse hibernate

上下文

我正在创建一个数据库环境,我想在几个不同的模式中拆分数据,以便用于不同的用户组。虽然,由于它包含共同实体,因此应该向每个人共享其中一个数据库。

假设数据库:

  • DB1 - 公共实体;
    • 车轮实体
  • DB2 - Group“A”;
    • 汽车实体
  • DB3 - 组“B”;
    • 摩托车实体

我有三个不同的项目:

  • 项目1:
    • 车轮豆
  • 项目2:
    • 汽车制造商
  • 项目3:
    • 摩托车构造师

问题

我正在尝试从项目/模式(2,“A”)和(3,“B”)访问轮子(项目1)

第一个问题:有可能吗? 第二:我怎么能这样做?

项目2中的

hibernate.cfg.xml配置为

<property name="hibernate.connection.url">jdbc:mysql://99.999.999.99:3306/DB2</property>

这必然会限制与DB2的所有连接,或者有另一种方法来添加新连接或使用3306端口或至少DB1中的所有数据库?

从项目2中的project1 映射实体似乎也不会成功,例如:

<mapping class="com.company.project1.Wheels"
        package="com.company.project1.Wheels" resource="com/company/project1/Wheels.hbm.xml"/>

配置

  • Eclipse Indigo
  • MySql 5.5
  • Hibernate 3.0(通过xml映射而不是注释)
  • 赢7

感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

您可以使用@Table(catalog="")指定它们所属的数据库,然后还可以跨数据库建立关系。

在您的情况下Wheel使用catalog属性映射到DB1,Car映射到DB2和MotorCycle到DB3。

我已经使用MySQL和MSSQL的这个解决方案,并且工作得非常好。只有约束这三个数据库必须在同一个数据库服务器中,用于访问数据库的用户应该拥有对所有数据库的适当权限。

因为此解决方案只是在所有查询中针对表添加模式名称。

答案 1 :(得分:1)

我会将我的项目分成多个自我维持的项目。 Wheel项目将是一个自给自足的项目,负责Wheel实体。

项目1:轮子 该项目将定义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来实现这一点。

答案 2 :(得分:1)

您需要的只是一个数据库连接工厂,它允许您在需要时使用所需的数据库。

请查看下面的课程,您可以根据该课程来解决问题

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<String, SessionFactory> sessionFactoryMap = new HashMap<String, SessionFactory>();

    public static final ThreadLocal sessionMapsThreadLocal = new ThreadLocal();

    public static Session currentSession(String key) throws HibernateException {

        HashMap<String, Session> sessionMaps = (HashMap<String, Session>) 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<String, Session> sessionMaps = (HashMap<String, Session>) sessionMapsThreadLocal.get();
        sessionMapsThreadLocal.set(null);
        if(sessionMaps != null) {
            for(Session session : sessionMaps.values()) {
                if(session.isOpen())
                    session.close();
            }
            ;
        }
    }

    public static void closeSession() {
        HashMap<String, Session> sessionMaps = (HashMap<String, Session>) sessionMapsThreadLocal.get();
        sessionMapsThreadLocal.set(null);
        if(sessionMaps != null) {
            Session session = sessionMaps.get("");
            if(session != null && session.isOpen())
                session.close();
        }
    }

    public static void buildSessionFactories(HashMap<String, String> 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<String, Session> sessionMaps = (HashMap<String, Session>) 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/