我使用 Hibernate 的主要原因之一是它提供了切换到另一个数据库的灵 active ,而无需重写任何代码。
但是直到现在我还没有找到一个好方法来定义我的 hibernate 实体所匹配的表上的附加 View ;我仍在为此使用简单的 SQL 脚本。有没有更优雅的方式来定义由 hibernate 管理的表上的 View ?
理想情况下,我想使用 HQL 或其他通用方法来完成这项工作,这样我就不必担心我的 SQL 脚本与其他类型的数据库不兼容。
如果有办法做到这一点,那么第二个问题就是从这些 View 中获取“合成”只读实例,这应该可以更容易地将聚合数据提供给 UI。
编辑:
似乎我没有把问题说得足够清楚,所以这就是我想要做的:我想编写独立于所用数据库的代码。由于我使用 hibernate ,我只需要更改方言配置文件,然后可以使用另一个 DBMS。
问题:如何在我的 hibernate 实体上创建 View ,不依赖于特定的 SQL 方言(以保持一切可移植性),甚至 HQL?如果可能的话,我可以使用 HQL 来查询这些 View ,即创建只读聚合实体吗?是否有任何额外的 hibernate 插件可以帮助我解决这个问题?到目前为止还没有找到任何东西... :-/
最佳答案
Hibernate 不会自动为您创建 View ,因为每种方言仅支持底层数据库的数据定义语言 (DDL) 的有限子集。基本上,它支持足够的 DDL 来生成工作模式,但不足以处理“额外”对象(如 View )的创建。
不过,一切都没有丢失。 Hibernate 确实使您能够在 XML 映射文件中自己创建(和删除)其他数据库对象,并且这些对象可以限定为特定方言。例如,我可以有这样的映射:
<hibernate-mapping>
<class name='com.mycompany.myproduct.Customer' table='tbl_customer'>
<id name='id' column='customer_id'>
<generator class='native'/>
</id>
<property name='name' length='50' unique='true' not-null='true' />
</class>
<database-object>
<create>create or replace view read_only_cust...</create>
<drop>drop view read_only_cust</drop>
<dialect-scope name='org.hibernate.dialect.Oracle9Dialect' />
</database-object>
</hibernate-mapping>
您可以通过添加更多“数据库对象”部分来自由创建所需的任何其他 View 。您必须为要支持的每个数据库自己编写 SQL (DDL),但由于它们的范围仅限于方言,Hibernate 将只为在模式导出时选择的方言执行 SQL。
关于java - 处理 hibernate 实体上的数据库 View 的优雅方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/901537/