Pensa a nivel base de datos, suponete que usas un codigo alfanumerico como PK 
de una tabla. Si tuvieras otra tabla con una FK a la primera, este seria un 
campo alfanumerico tambien y de esa manera estas ocupando mas espacio que el 
que ocuparia un long. Ademas las comparaciones de las consultas tardan mas 
tiempo cuando se trata de comparar campos alfanumericos. Es por eso que 
generalmente se usa un long ya que no molesta y te ahorras problemas, pero bien 
podrias usar un PK compuesta si quisieras aunque en lineas generales no tienen 
ventaja alguna.

 

Tu problema particular de que si usas un long como PK no podes validar 
naturalmente que un campo sea unico se resuelve si usar equals, no hace falta 
que un campo sea PK para que sea UNIQUE, o sea si queres que tu campo nombre 
sea unico y no pertenezca a tu clave primaria simplemente agrega en tu base de 
datos una constraint unique al campo nombre y listo. Eso en la entidad se ve 
reflejado colocando una annotation de JPA en donde indicas que ese campo es 
unique, incluso creo que esa misma annotation podes usarla con Hibernate 
Validator para hacer las validaciones de negocio, pero nunca investigue 
demasiado.

 

Siempre fijate si podes evitar el equals, por ejemplo tal vez no haga falta 
usar un contains de una coleccion para saber si un elemeno esta o no, tal vez 
te convenga directamente ejecutar una query con algun WHERE y si la coleccion 
que te retorna esta vacia es porque el elemento no existe. Al reducir al minimo 
el uso del equals vas a llegar a la conclusion que con un equals que solo 
analiza id alcanza, si no es asi entonces yo escogeria tu opcion numero 3 en 
donde en lugar de implementar mi metodo equals2 implementaria un metodo que 
valide cada regla de validacion en particular para que esas reglas de 
validacion se vean claramente reflejadas en el codigo, esos metodos los pondria 
en una clase aparte que llamaria Validator.

 

 


Date: Mon, 25 May 2009 14:21:18 -0300
Subject: Re: [Prog] Base de datos + Id numerico en vez de identificador natural 
de la entidad + java
From: [email protected]
To: [email protected]

Hace rato que no uso Hibernate, pero si no mal recuerdo, una de las buenas 
razones para usar un id por separado, 
era que le podías indicar a Hibernate que lo asigne automáticamente. De esta 
manera, te desligás de la tarea de mantener la consistencia en la base de datos 
desde tu código de entidad.
De hacerlo así, no deberías usar el id de la base en el equals/hash, por que 
estos se generarán una vez que persistas el objeto (y realmente no tienen 
significado "de negocio"). Acá se discute esto: 
https://www.hibernate.org/109.html

Saludos.


El 25 de mayo de 2009 13:07, Victor Del Rio <[email protected]> 
escribió:

Buenas, estoy trabajando con un modelo en java que va a persistir con
hibernate y me surgio una duda:

1. ¿Porque usar un id numerico (ej: Long id) envez de usar los campos
que realmente identifican a la entidad?

  Yo me imagino que sera por el tema de el tamaño que tomaría la base
de datos.

  Pero el tema es que eso, y usar el hashCode y equals con el id no
me permiten validar naturalmente
  algunas reglas del negocio como por ejemplo si yo no quiero que
haya dos o mas entidades del mismo
  nombre (porque ese era su identificador natural) ya no me sirve el
equals, ni el contains de
  collection ni nada.

  Entonces me surgen tres opciones de las cuales no se cual es mas
conveniente, talvez inclusive alguna no sea valida:

  1. No uso id numerico sino que uso los identificadores naturales
(ej: nombre, dni) y uso tambien estos
     para el hash code y equals.

  2. Uso los id numericos pero en hash code y equal uso los
identificadores naturales.

  3. Uso los id numericos, tambien en el hash code y equals, pero
agrego un metodo mas a las clases entidad que
     compare por los identificadores naturales (algo asi como
"obj.igualSegunNegocio(otroObj)") y uso ese metodo
     para comparar en el modelo.

Bueno agradezco cualquier sugerencia, saludos.

_______________________________________________
Lista de correo Programacion.
[email protected]
http://listas.fi.uba.ar/mailman/listinfo/programacion


_________________________________________________________________
¿Uno por uno? ¡Mejor todos a la vez! Sumá a tus amigos a Windows Live
http://www.microsoft.com/argentina/windows/windowslive/products/social-network-connector.aspx
_______________________________________________
Lista de correo Programacion.
[email protected]
http://listas.fi.uba.ar/mailman/listinfo/programacion

Responder a