java - 处理 hibernate 实体上的数据库 View 的优雅方法?

标签 java database hibernate

我使用 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/

相关文章:

java - 在EndOfMedia 上更改场景

asp.net - 如何显示表中的所有记录 ASP.NET MVC 3

hibernate - RESTORE_VIEW 中的 LazyInitializationException(PersistentSet 实例化不正确)

java - 具有给定长度单元测试的随机字符串

java - 在Android上通过OkHttp连接到websocket时如何捕获UnknownHostException?

java - 如何在intellij ce的执行maven目标窗口中清除先前 "command line"的列表

Python3-LDAP 未返回预期结果

mysql - 如何编写通过外键的 SQL 查询

java - hibernate 更新一对多项目集

java - JPA/Hibernate5 通过序列名获取序列nextval