persisitir Booleanos o booleanos

2 views
Skip to first unread message

Leslie Solorzano

unread,
Nov 26, 2009, 10:05:48 PM11/26/09
to is1_unal_2009_02
Hola, tengo una pregunta:
Hasta ahora me fijo que los booleanos no los persiste bn el JPA quedan
guardados con la letra b, sea verdadero o falso. por que? no se, pero
entonces intente mapeando con @Basic y tampoco funciono, hay una
forma? o mas bn lo paso a 0 o 1 o a Y o N

miguel

unread,
Nov 27, 2009, 9:11:24 AM11/27/09
to is1_unal...@googlegroups.com


El 26 de noviembre de 2009 22:05, Leslie Solorzano <zloy.sm...@gmail.com> escribió:

Hola,

Hola Leslie
 
tengo una pregunta:

Veamos la duda
 

Te debo confesar que nunca lo había notado, revisé mis proyectos y no tienen ningún booleano :D.

Bueno, primero, debo decirte a manera de información (y a todo el grupo) que existen dos maneras diferentes de realizar la persistencia de una aplicación, la primera es la que ustedes ya conocen (generar las clases, agregar anotaciones y crear la base de datos a partir de estas clases), la segunda, mucho más sencilla, pero con menos control (esto se ve reflejado en proyectos más grandes con muchas relaciones entre tablas, donde la aplicación resulta haciendo cosas que no se deseaban) es crear la base de datos y a partir de ella crear las clases entidad (pueden revisar esto en el apartado nuevo->otro->persistencia->clases entidad a partir de base de datos, donde solo deberán definir la conexión a la base de datos y algunos parámetros, así fué como se trabajó el semestre pasado, pero esto fue debido a la manera en que venían adelantando la aplicación y la falta de tiempo).

Esto lo digo porque al ver tu problema intenté experimentar de esta manera, creando una base de datos de prueba, agregando una tabla con un campo booleano y generando las clases entidad a partir de ella. Noté entonces dos cosas:

1. En la base de datos el campo booleano queda definido como "tinyint"
2. En la clase entidad se agregó la anotación @Basic(optional = false)

Como ya habías mencionado tú que le habías agregado dicha anotación, entonces supuse que no sería esta la razón, ejecuté entonces una prueba agregando un valor verdadero y uno falso y funcionó bien.

Entonces hice el procedimiento inverso, ya que tenía la entidad con anotaciones, hice un drop and create en la unidad de persistencia, entonces noté:

1. En la base de datos el campo booleano quedó definido como char

Al ejecutar las pruebas sucedió lo que tú ya mencionaste: sin importar el valor ingresado agregaba un "b".

Entonces tuve que hacer lo que cualquier persona haría: preguntarle a google. Lo primero que encontré fué que se debía agregar la anotación Basic, pero ya lo habíamos hecho y no funcionaba, también encontré que esto dependería de la librería de persistencia que se utilizara (en mi caso estoy usando hibernate), entonces agregué este término a la búsqueda, encontrando en este link:
http://stackoverflow.com/questions/1154833/configure-hibernate-using-jpa-to-store-y-n-for-type-boolean-instead-of-0-1
que se debía agregar la anotación @Type(type="yes_no") (o según parece también con true_false, aunque no lo probé), lo hice y entonces revisé, al agregar los valores a la base de datos los agrega como "y" o "n", lo que me pareció curioso, entonces hice pruebas de escritura->lectura y funcionó correctamente.

Entonces tienes la opción de agregar esta anotación con lo que funcionaría correctamente.

No obstante, y la razón por la que escribí todo lo que escribí, es porque estamos haciendo comparación de un caracter (1 byte generalmente) cuando en realidad necesitamos un booleano (1 bit), esto podría ser optimizado, y me parece que la manera de hacerlo sería modificar la base de datos. Como ya dije anteriormente, agregando la anotación de tipo funcionará sin problemas, pero si quieres optimizarlo al máximo podrás a través del query browser por ejemplo, modificar la tabla en el campo booleano de char a boolean (el se encargará de dejarlo como tinyint con longitud deseada y unsigned).

Si deseas respuestas más técnicas puedes encontrar mucha documentación acerca de cómo manejar estos tipos en la página de hibernate, por ejemplo en:
https://www.hibernate.org/189.html
explican cómo se puede personalizar el booleano.

Espero que esto haya sido de ayuda para solucionar tu problema.

--
Miguel Cubides
Ingeniería de Sistemas
Universidad Nacional

Leslie Solorzano

unread,
Nov 28, 2009, 6:26:27 PM11/28/09
to is1_unal_2009_02
No me sirvió nada de eso, pero si a alguien le interesa ya encontre
como, y de hecho es algo mucho mejor para solucionar cualquier otro
problema con tipos de datos sencillamente se pone

@Column(columnDefinition="boolean") y funciona, en la BD queda como 0
y 1 pero lo bueno es q cuando lo traigo de la bd a java = java si lo
entiende como true y false jajajaja

la idea la saque de leer este link http://blog.tremend.ro/2007/08/27/hibernate-annotations-default-value/
por si akso.

Gracias miguel en todo caso, siempre me gusta saber por q ocurren los
errores y la explicación me gustó.

pd: la notacion de @Type no me funciono tampoco.

On 27 nov, 09:11, miguel <mcubi...@gmail.com> wrote:
> El 26 de noviembre de 2009 22:05, Leslie Solorzano <
> zloy.smiertn...@gmail.com> escribió:
> en este link:http://stackoverflow.com/questions/1154833/configure-hibernate-using-...
Reply all
Reply to author
Forward
0 new messages