当前位置: 首页 > 面试题库 >

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

楚骞尧
2023-03-14
问题内容

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

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

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

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

编辑:

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

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


问题答案:

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。



 类似资料:
  • 问题内容: 我使用Hibernate的主要原因之一是它提供了无需切换任何代码即可切换到另一个数据库的灵活性。 但是直到现在,我还没有找到在与我的hibernate实体匹配的表上定义其他视图的好方法。我仍然为此使用简单的SQL脚本。有没有一种更优雅的方式来定义由hibernate管理的表上的视图? 理想情况下,我想使用HQL或其他通用方法来完成这项工作,因此我不必担心我的SQL脚本与其他类型的数据库

  • 问题内容: 我们的数据模型分为两个数据库上的架构。这些模式是隔离使用的,除了在两者之间桥接的一些单键关系。没有跨两个数据库的写事务。 与这个问题类似,我们要使用Hibernate在不同数据库中的2个表上进行联接,我们想使用Hibernate来处理实体的联接。我们不能使用数据库解决方案(DB2上的联合视图)。 我们为Hibernate设置了两个单独的数据库配置(“医生”和“病人”),当使用DAO显式

  • 问题内容: 我使用Hibernate 4和Spring 3。 我有两个实体。 图书实体 和作者实体 和JSON取决于pom.xml 我的根上下文在这里- … servlet-context.xml 控制器。 在我的DAO中找到findAll: 在调试中,我看到该方法返回2条记录,但是Spring无法将结果转换为JSON并返回406 HTTP错误。怎么了? 我附上我在调试中看到的图像。- http:

  • 问题内容: 我有一个“复杂”的问题。 我正在使用Hibernate / JPA与数据库进行事务。 我不是DBA,客户端使用了我的应用程序,即RESTful Web服务。我的问题是数据库已更改(不是很频繁,但仍在更改)。另外,客户端并不总是尊重我的应用程序的输入(长度,类型等)。发生这种情况时,Hibernate会引发异常。异常很难翻译和从日志中读取,因为它具有嵌套的异常并且由很多文本组成:就像我说

  • 问题内容: 目前,我在 每个 Controller方法中 都 重复了以下代码: 这是正确的方法还是有更好的方法,也许在一个我可以引用的单独的类中?如果是这样,怎么办?每当我尝试将其放在单独的类中并从其他类中引用它时,它都会失败。 编辑 :我正在尝试使用尽可能少的外部库。如果Java在JDK中内置了ORM / JPA实现,我就不会使用Hibernate。 问题答案: 我本人已经遇到了很多次。通常,我

  • 问题内容: 是否可以仅对hibernate-search的注释(bean => document / document => bean mapping)使用hibernate-search,而不使用数据库?如果是这样,是否有任何在线样本基本上显示了如何进行设置? 我发现了以下内容:http : //mojodna.net/2006/10/02/searchable-annotation-drive