【发布时间】:2008-12-29 17:55:03
【问题描述】:
我们的应用程序将 Hibernate 用于 ORM,并将数据存储在多个模式中,并由为应用程序定制授权的用户访问它们。
模式名称是在运行时根据数据确定的;在实体映射文档中包含他们的名字是不可行的。这意味着我需要一种方法来告诉 Hibernate 在执行查找时使用特定的模式名称。有没有办法做到这一点?
【问题讨论】:
我们的应用程序将 Hibernate 用于 ORM,并将数据存储在多个模式中,并由为应用程序定制授权的用户访问它们。
模式名称是在运行时根据数据确定的;在实体映射文档中包含他们的名字是不可行的。这意味着我需要一种方法来告诉 Hibernate 在执行查找时使用特定的模式名称。有没有办法做到这一点?
【问题讨论】:
这里有一个页面列出了您可以管理multiple schemas in Hibernate 的一些方法。我可能会去实现你自己的connection provider。您可能还想禁用缓存。
【讨论】:
我们在工作中遇到了这个问题。正如 Robert 建议的那样,我通过创建一个名为“OracleSchemaRemappingDataSource”的连接提供程序(即 DataSource 的实现)并使用 spring 进行管道来修复它。
基本上,这个数据源实现了getConnection()。该方法的实现是通过spring注入从其他数据源获取连接,它假设是一个oracle连接,然后执行
ALTER SESSION SET CURRENT_SCHEMA = 'someotherschema'
然后他们将那个连接传回来。
所有的休眠配置都小心使用名称而不为它们指定架构。
另外:有了这个,您不想禁用缓存 - 允许 hibernate 照常管理连接,因为我们没有在应用程序中做任何魔术,例如在每个用户的基础上使用不同的连接。
【讨论】: