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

但到目前为止,我还没有想出一种好方法来定义Hibernate实体与之匹配的表上的附加视图;为此,我仍然使用简单的SQL脚本.有没有更优雅的方式来定义由Hibernate管理的表上的视图?

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

如果有办法做到这一点,那么第二个问题就是从这些视图中获取"合成的"只读实例,这应该会使将聚合数据提供到UI中变得容易得多.

EDIT:

似乎我没有把问题说得足够清楚,所以我想要做的是:我想编写独立于使用的数据库的代码.因为我使用的是Hibernate,所以我只需更改方言配置文件,然后就可以使用另一个DBMS.

问:如何在我的Hibernate实体without上创建views,依赖于特定的SQL方言(以保持所有内容的可移植性),甚至是HQL?如果可能,我是否可以使用HQL查询这些视图,即创建只读聚合实体?有没有其他Hibernate插件可以帮我做到这一点?到目前为止还没有发现任何东西.:-/

推荐答案

Hibernate不会自动为您创建视图,因为每种方言只支持底层数据库的数据定义语言(Data-Definition Language,DDL)的有限子集.基本上,它支持足够的DDL来生成工作模式,但不足以处理视图等"额外"对象的创建.

不过,一切都没有失go .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将只为模式导出时 Select 的方言执行SQL.

Database相关问答推荐

Postgres和Oracle之间 Select 查询的结果差异

如何在 C# 控制台应用程序中执行 CMD 命令?

Android SQLiteno such table异常

使用python为组中的每个元素添加一个序列号

Oracle SQL 开发人员中的 DB2 数据库

数据验证是否应该在数据库级别进行?

我可以在 mysql 中的 select 语句上启动触发器吗?

ODBC 与 JDBC 与 ADO.NET

被删除的行占用的空间会被重新使用吗?

什么是表前缀?

Joomla 数据库设置

HTML5 数据库存储 (SQL lite) - 几个问题

MySQL是否允许使用点创建数据库?

为什么在连接表上有一个主键不好?

在数据库中存储年份

如何使用 django 判断 postgresql 数据库中是否存在某些内容?

PostgreSQL 的示例数据库

如何删除除了postgres中的少数数据库之外的所有数据库

PHP PDO: error number' 00000' when query is correct

获取 SQL Server 2008 中新插入行的主键