spring + hibernate - 将实体映射到不同的数据源

Posted

技术标签:

【中文标题】spring + hibernate - 将实体映射到不同的数据源【英文标题】:spring + hibernate - mapping entities to different data sources 【发布时间】:2012-03-10 15:05:32 【问题描述】:

我的应用目前在自己的数据库中处理其用户。 我正在创建一个 CAS 应用程序,它将集中管理我的应用程序和其他应用程序的用户。此 CAS 应用程序将使用自己的数据库,其他应用程序将可以访问它。 我对包括 CAS 在内的所有应用程序使用相同的休眠实体“用户”。

我的目标是能够配置应用在查找“用户”实体时是使用“本地”数据库还是“CAS”数据库。

此配置不必在运行时更改。它可以是 spring 上下文 xml 配置(或只是一组不同的导入)。

我不想使用额外的会话工厂。当我意识到我需要在 web.xml 中定义更多的 open-in-session-view 过滤器——每个工厂一个。

如何配置单个会话工厂以根据某些配置从不同的数据源加载此实体(可能还有其他相关的实体)?

【问题讨论】:

【参考方案1】:

看看这个关于动态数据源路由的blog post。它可以帮助你:-)

【讨论】:

已经看过这个并认为它对我没有帮助。在他们的示例中,他们根据某些配置从不同的数据库加载项目(或用户...)。除了用户之外,我还有更多数据,我不想将该数据的加载路由到不同的数据源/数据库。我只希望用户根据某些配置从不同的数据库加载。【参考方案2】:

您是否查看过 Hibernate 4 中的多租户支持? http://relation.to/Bloggers/MultitenancyInHibernate

【讨论】:

刚才看了一下。第一个关于分区的例子将解决这个问题。这导致我查看休眠碎片,这反过来又导致我走入了死胡同。看起来休眠碎片有些死了。我在任何 maven repo 上都找不到该项目(尝试过 central 和 jboss)。我什至无法在 Jarvana 中找到它的课程。它只能从 hibernate.org 站点下载,但我不想弄乱 maven 本地 repo jar 安装...我会尝试看看他们的第二个建议 - hibernate 过滤器。 顺便说一下,我正在使用hibernate 3.6.1-Final。 多租户 != 分片。这是 Hibernate 4 中引入的一项新功能。因此,如果您无法升级,请忽略这一点。不过,这是当今在 Hibernate 中处理多个数据源的“正确”方式。 我正在更新到 4.1.0.Final atm。会看看它是否破坏了我的项目中的任何东西。无论如何,我的问题不是真正的多租户问题。我没有多个租户需要从不同来源加载数据。我只需要从不同的数据库加载我的用户实体。我认为分片会起作用,因为我会将用户数据库配置为一个分片 - 当使用 cas 时,整个分片将是 cas db,当不使用它时,整个分片将是应用程序本地数据库。 已完成迁移到 4.1.0。我查看了连接提供程序解决方案,但它与 Spring 的 AbstractRoutingDataSource 基本相同。我只需要为用户实体访问 CAS 数据库,而不是全部。它看起来像是回到 2 个会话工厂或使用普通的旧 jdbc+sql...

以上是关于spring + hibernate - 将实体映射到不同的数据源的主要内容,如果未能解决你的问题,请参考以下文章

Spring ORM数据访问——Hibernate

Spring ORM数据访问——Hibernate

Spring ORM数据访问——Hibernate

Spring对象映射器covertValue方法不转换某些字段

是否将Lazily提取的对象附加到Hibernate会话(由Hibernate支持的Spring Data)?

Spring / Hibernate - 删除实体时抛出 StaleStateException