Rol*_*ald 26 java database hibernate
我使用Hibernate的一个主要原因是它提供了切换到另一个数据库的灵活性,而无需重写任何代码.
但到目前为止,我还没有想出一个很好的方法来定义与我的hibernate实体匹配的表的其他视图; 我仍在使用简单的SQL脚本.有没有更优雅的方法来定义由hibernate管理的表的视图?
理想情况下,我想使用HQL或其他通用方法来完成这项工作,这样我就不必担心我的SQL脚本与其他类型的数据库不兼容.
如果有办法做到这一点,那么第二个问题就是从这些视图中获取"合成"只读实例,这样可以更容易地将聚合数据提供给UI.
编辑:
好像我没有把问题弄清楚,所以这就是我想要做的:我想编写独立于使用过的数据库的代码.由于我使用hibernate,我只需要更改方言配置文件,然后可以使用另一个DBMS.
问题:如何在不依赖特定SQL方言(保持一切可移植性)甚至是HQL的情况下在我的hibernate实体上创建视图?如果可能的话,我可以使用HQL查询这些视图,即创建只读聚合实体吗?是否有任何额外的hibernate插件来帮助我?到目前为止还没找到任何东西...: - /
Rob*_*b H 22
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>
Run Code Online (Sandbox Code Playgroud)
您可以通过添加更多"数据库对象"部分来自由创建所需的任何其他视图.您必须自己为要支持的每个数据库编写SQL(DDL),但由于它们的范围是方言,因此Hibernate只会为在模式导出时选择的方言执行SQL.
Dom*_*nik 12
有同样的问题,并在hibernate doucmentation中找到以下解决方案:
Hibernate映射的视图和基表之间没有区别.这在数据库级别是透明的,尽管某些DBMS不能正确支持视图,尤其是对于更新.有时您希望使用视图,但无法在数据库中创建视图(即使用旧模式).在这种情况下,您可以将不可变和只读实体映射到给定的SQL子选择表达式:
<class name="Summary">
<subselect>
select item.name, max(bid.amount), count(*)
from item
join bid on bid.item_id = item.id
group by item.name
</subselect>
<synchronize table="item"/>
<synchronize table="bid"/>
<id name="name"/>
...
</class>
Run Code Online (Sandbox Code Playgroud)
https://docs.jboss.org/hibernate/stable/core/manual/en-US/html_single/#mapping-declaration
| 归档时间: |
|
| 查看次数: |
36615 次 |
| 最近记录: |