ORMs Hibernate entre otros

Sección diseñada para tratar temas de frameworks ORM como Hibernate.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de DragonNegro

¿Como Trabajar con base de datos sin llaves primarias?

Buenas tardes a todos,

Se sabe que Hibernate esta diseñado para administrar la persistencia de las base de datos tratando de simplificar la cantidad de código, realizando un puente entre las base de datos y la POO, es decir manejar el acceso a datos a tal nivel que se pueda realizar a nivel de objetos.

Pero también es un framework diseñado para bases de datos con una buena integridad referencial, por lo tanto es un poco complejo tratar con base de datos con una pobre entidad relación, por ende me refiero al siguiente problema:

Tengo una base de datos con este escenario pero como es una base de datos que se encuentra en producción hace tiempos, es muy poco factible que se pueda cambiar el modelo de datos.

El problema radica en que se está realizando una sentencia con dos tablas, una con llave primaría y otra sin llave primaria, estas dos no estan relacionadas en la base de datos. Las cuales se debe realizar una consulta para relacionar ya que tiene datos en común pero el problema es que lógicamente la tabla que no tiene llave primaria me trae el número de datos correcto pero todas la ocurrencias duplicadas con el primer dato de las mismas.

Se ha intentado solucionar el problema manejando sentencias con el método nativo y agregando las clases con el método correspondiente pero sigue presentando el problema cuando son sentencias que consultan dos tablas al tiempo

createSQLQuery() // Método nativo para realizar la consulta a la BD
addEntity(alias, clase.class) // Método para agregar alias que no tienen relación en la base de datos y adicionalmente agregar los alias correspondientes de cada tabla a todos los atributos.

Anteriormente tenía el método de trasformación con el cual se soluciona el problema de la duplicidad, pero, solamente en una sola tabla.

consulta.setResulsetTransformer(Transformer.aliastobean(clase.class)) // Agrega alias a la tabla y transforma la sentencia trayendo los datos correctos.

Si el método anterior se intenta implementar en una consulta que contenga más de una tabla no funciona correctamente, ya que define los alias de los atributos de ambas tablas con la última tabla que se realiza la transformación y por ende no encuentra los campos de la primera tabla ya que los busca en la segunda, por que el alias corresponde a la segunda tabla.

He estado mirando el api y la documentación y consultando en internet pero no existe temas relacionados a este problema específico para este pequeño chicharón peludo.

Por lo tanto quiero saber si existe un método que se comporte muy similar al método de transformación o si hay otro método que soluciona el problema de duplicidad y datos incompletos de tablas sin llaves primarías para probarlo.

O si definitivamente mi segunda alternativa es encontrar la tabla que contenga los datos más completos y con estos datos traer los datos de la segunda tabla con un atributo que tiene relación como se encuentra actualmente . Ya que hay que actualizar las dos tablas.

(Me aseguran que los datos que se encuentran en una tabla siempre estan en la otra)

Gracias por su respuesta y atención.

Imagen de Nopalin

Sin entidades

Por que mejor para esa situacion, te olvidas un poco de las entidades y buscas otras funciones de hibernate para solucionar el problema.

Por ejemplo, en la base de datos crear una vista, en hibernate crear un named query y buscar informacion atravez de el. En el namedquery puedes definir los parametros que desees, la desventaja es que todos los parametros que definas los debes usar siempre en la consulta, puedes crear varios named queries jeje. El problema con esto esque solo funciona para las busquedas, para el persistir información estas frito.

ahora, por que no creas un primari key a la tabla problematica y la utilizas en hibernate como ellos mandan? a menos que el sistema original siga creando registros creo ya hay otro problema.

sobres

Imagen de DragonNegro

Listo

Gracias por su respuesta.

Pero como usted dice estoy frito con la persistencia y como las tablas ya tienen muchos datos la creación de la llave primaria no se puede hacer y no dejan tampoco.

La única solución para esa belleza de modelo es generar una sentencia por cada tabla y con la información de un dato dada en una, realizar la consulta de la segunda tabla y asi con esta información lograr realizar la persistencia que se necesita para las dos entidades, aunque como dirían los que realizan cosa extrañas esto no lo practiquen en casa.

Siempre al utilizar hibernate asegúrensen que el modelo siquiera tenga llaves primarias por que si no la vuelta es bien grande o preparence para luchar contra la corriente.

Recuerde que si se encuentran en su vida profesional con un modelo como el mencionado anteriormente utilicen sentencias nativas para tablas sin llaves primarias y conjuntamente con esto utilicen el método setResultTransform() () ya que es la soluciona a los problemas de duplicidad y de datos incompletos trayendo la información correctamente sin ambiguedad.

setResultTransform() //Solamente es posible utilizarlo con sentencias con una sola tabla ya que no funcionar apropiadamente para sentencias que tienen más de una tabla que no tenga llaves primarias.

Gracias por la atención prestada.