【问题标题】:Need to map classes to different databases at runtime in Hibernate需要在 Hibernate 运行时将类映射到不同的数据库
【发布时间】:2011-03-01 11:22:35
【问题描述】:

我有MainDB 数据库和未知数量的UserDB_1,...,UserDB_N 数据库(在编译时)。 MainDB 包含某些表中那些UserDB 数据库的名称(可以在运行时创建新的UserDB)。

所有UserDB 具有完全相同的表名和字段。

在 Hibernate 中如何处理这种情况? (数据库结构不能更改)。

目前我正计划创建没有映射到任何东西的通用 User 类,并且只对所有查询使用本机 SQL:

session.createSQLQuery("select * from " + db + ".user where id=1")
    .setResultTransformer(Transformers.aliasToBean(User.class));

还有什么更好的办法吗?理想情况下,我希望拥有 UserDB 表和关系的映射,并在所需的数据库上使用 HQL。

【问题讨论】:

    标签: java mysql hibernate mapping


    【解决方案1】:

    您在构建SessionFactory 时指定数据库(通过DataSource 的连接字符串)。当您想使用另一个数据库时,只需使用新的DataSource 重新构建SessionFactory。

    【讨论】:

    • 能否请您展示如何重建它?它不会影响整个应用程序吗?我只需要为特定查询临时切换到另一个数据库。以及如何映射用户表?我需要提供一些用于映射的表名,但用户数据库在编译时可能不存在,所以我无法将它们映射到任何特定的东西。
    • 我也使用 Spring,所以这个 SessionFactory 在配置文件中初始化并包装在 TransactionManager 中。
    【解决方案2】:

    声明并注入不同的SessionFactory(每个数据库一个)。

    【讨论】:

      【解决方案3】:

      在 Hibernate 博客上阅读这篇文章:http://in.relation.to/Bloggers/MultitenancyInHibernate

      Steve 说使用 ConnectionProvider 比使用单独的 SessionFactory 更好。

      记得禁用二级缓存。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-10
        • 1970-01-01
        • 2014-12-20
        • 2017-03-05
        • 2018-11-29
        • 2016-07-02
        • 2014-07-22
        相关资源
        最近更新 更多