一尘不染

处理hibernate实体上数据库视图的优雅方法?

hibernate

我使用Hibernate的主要原因之一是它提供了无需切换任何代码即可切换到另一个数据库的灵活性。

但是直到现在,我还没有找到在与我的hibernate实体匹配的表上定义其他视图的好方法。我仍然为此使用简单的SQL脚本。有没有一种更优雅的方式来定义由hibernate管理的表上的视图?

理想情况下,我想使用HQL或其他通用方法来完成这项工作,因此我不必担心我的SQL脚本与其他类型的数据库不兼容。

如果有办法做到这一点,那么第二个问题就是从这些视图中获取“合成”只读实例,这将使将汇总数据馈送到UI变得更加容易。

编辑:

似乎我没有足够明确地解决问题,所以这是我想做的事情:我想编写独立于所用数据库的代码。由于我使用了hibernate模式,因此只需更改方言配置文件,然后可以使用其他DBMS。

问题:如何在 依赖特定SQL方言(使所有内容可移植)甚至HQL的 情况下 在hibernate实体上创建 视图
?如果可能的话,是否可以使用HQL来查询这些视图,即创建只读聚合实体?有没有其他的hibernate插件可以帮助我呢?到目前为止还没有找到任何东西…:-/ __


阅读 359

收藏
2020-06-20

共1个答案

一尘不染

Hibernate不会自动为您创建视图,因为每种方言仅支持基础数据库的数据定义语言(DDL)的有限子集。基本上,它支持足够的DDL来生成工作模式,但不足以处理诸如视图之类的“额外”对象的创建。

但是,一切都不会丢失。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>

您可以通过添加更多的“数据库对象”部分来随意创建所需的其他视图。您必须为要支持的每个数据库自己编写SQL(DDL),但是由于它们的作用域是方言,因此Hibernate将仅对模式导出时选择的方言执行SQL。

2020-06-20