3

语境

我正在创建一个数据库环境,我想在几个不同的模式中拆分数据以用于不同的用户组。虽然,这些数据库之一应该与所有人共享,因为它包含公共实体。

假设数据库:

  • DB1 - 通用实体;
    • 车轮实体
  • DB2——“A”组;
    • 汽车实体
  • DB3 - “B”组;
    • 摩托车实体

我有三个不同的项目:

  • 项目一:
    • 轮子豆
  • 项目二:
    • 汽车构造器
  • 项目 3:
    • 摩托车构造器

问题

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

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

hibernate.cfg.xml在项目 2 中配置为

<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"/>

配置

  • 日蚀靛蓝
  • mysql 5.5
  • Hibernate 3.0(通过 xml 映射而不是注解)
  • 赢 7

感谢您的帮助!

4

3 回答 3

5

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

在您的情况下,使用目录属性Wheel映射到 DB1、CarDB2 和DB3。MotorCycle

我已经将此解决方案与 MySQL 和 MSSQL 一起使用,并且运行良好。唯一的约束是所有三个数据库都必须位于同一数据库服务器中,并且用于访问数据库的用户应该对所有数据库具有适当的权限。

由于此解决方案仅在所有查询中针对表添加架构名称。

于 2012-12-14T13:12:53.813 回答
1

我会将我的项目划分为多个自我维持的项目。Wheel 项目将是照顾 Wheel 实体的自给自足项目。

项目 1:Wheel 该项目将定义 Hibernate 实体和 DAO 以访问/修改 Wheel 定义。另外我会在这个项目中配置一个单独的数据源,它指向 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 的情况下实现这一点。

于 2012-12-14T11:39:08.020 回答
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/

于 2012-12-14T11:39:11.983 回答