java - codigo - ¿Maneras elegantes de manejar vistas de bases de datos en entidades de hibernación?
java base de datos (4)
¿Puedes declarar las vistas directamente dentro de la base de datos? A continuación, puede seleccionar directamente desde las vistas. Echa un vistazo al capítulo 10.4.4 del manual de Hibernate.
Eso debería permitirle SELECCIONAR desde la vista de la base de datos y hacer que Hibernate hidrate automáticamente los datos en sus entidades.
Por supuesto, una vista no toma ningún parámetro. Se supone que Hibernate 3 es compatible con los procedimientos almacenados, pero lo he usado.
Una de las razones principales por las que uso Hibernate es que proporciona la flexibilidad para cambiar a otra base de datos sin tener que volver a escribir ningún código.
Pero hasta ahora no encontré una buena manera de definir vistas adicionales en las tablas con las que se comparan las entidades de hibernación; Todavía estoy usando scripts SQL simples para eso. ¿Existe una forma más elegante de definir vistas en las tablas administradas por hibernación?
Idealmente, me gustaría usar HQL u otro método genérico para hacer el trabajo, para no tener que preocuparme de que mis scripts SQL sean incompatibles con otros tipos de bases de datos.
Si hay una manera de hacerlo, un segundo problema sería obtener instancias "sintéticas" de solo lectura de estas vistas, lo que debería facilitar mucho la alimentación de los datos agregados en una IU.
EDITAR:
Parece como si no hubiera aclarado el problema lo suficiente, así que esto es lo que estoy tratando de hacer: quiero escribir un código que sea independiente de la base de datos utilizada. Dado que uso hibernación, solo tendría que cambiar el archivo de configuración de dialecto y luego podría usar otro DBMS.
Pregunta: ¿Cómo crear vistas en mis entidades de hibernación sin depender de un dialecto SQL específico (para mantener todo portátil), o incluso HQL? Y si eso es posible, ¿puedo usar HQL para consultar también estas vistas, es decir, para crear entidades agregadas de solo lectura? ¿Hay algún complemento adicional de hibernación que me ayude con eso? No he encontrado nada hasta ahora ...: - /
¿Qué quiere decir con "crear vista"? Sé lo que significa a partir de un contexto de DB puro, pero eso no es lo que quieres decir, ¿verdad?
Puede asignar nuevas clases de Java a las mismas tablas para crear una "vista" o puede usar HQL para seleccionar un subconjunto de las columnas asignadas por otras clases persistentes.
HTH
Hibernate no creará automáticamente las vistas para usted, ya que cada dialecto solo admite un subconjunto limitado del lenguaje de definición de datos (DDL) de la base de datos subyacente. Básicamente, soporta suficiente DDL para generar un esquema de trabajo, pero no lo suficiente para manejar la creación de objetos "extra" como las vistas.
Todo no esta perdido. Hibernate le brinda la posibilidad de crear (y soltar) objetos de base de datos adicionales en los archivos de mapeo XML, y esos objetos se pueden ubicar en un dialecto en particular. Por ejemplo, podría tener una asignación como esta:
<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>
Usted es libre de crear cualquier vista adicional que desee agregando más secciones de "objeto de base de datos". Debe escribir el SQL (DDL) por sí mismo para cada base de datos que desee admitir, pero como se encuentran dentro del dialecto, Hibernate solo ejecutará el SQL para el dialecto elegido en el momento de la exportación del esquema.
Tuvo el mismo problema y encontró la siguiente solución en la duplicación de hibernación:
No hay diferencia entre una vista y una tabla base para un mapeo de Hibernate. Esto es transparente en el nivel de la base de datos, aunque algunos DBMS no admiten las vistas correctamente, especialmente con las actualizaciones. Algunas veces desea usar una vista, pero no puede crear una en la base de datos (es decir, con un esquema heredado). En este caso, puede asignar una entidad inmutable y de solo lectura a una expresión de subselección de SQL dada:
<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>
https://docs.jboss.org/hibernate/stable/core/manual/en-US/html_single/#mapping-declaration