Hola, soy nueva programando y estoy intentando trabajar con dos clases: Visita y Estudio. Cada Visita debe tener una colección de Estudios realizados. Pasa que cuando intento utilizar @ManyToMany, recibo un error y no entiendo por qué. Es específicamente con esta relación, ya que @OneToOne, @OneToMany y @ManyToOne funcionan perfectamente.
El error sucede cuando entro al tab de Visita, sin embargo, el tab de Estudio funciona perfectamente (puedo ver, agregar y modificar estudios). Borré las tablas implicadas suponiendo que era un problema de la base de datos, también actualicé a la última versión de OpenXava, pero el problema persiste. Acá dejo las clases, la traza y una foto del navegador cuando sucede. Gracias de antemano si alguien puede ayudarme y decirme qué puedo modificar de una forma detallada porque aún no sé mucho :).
He probado el codigo en un proyecto nuevo y ha funcionado sin problemas, habría que depurar un poco más, sospecho que quiza al cambiar las relaciones varias veces, produjo un erro en la base de datos, aunque no estoy seguro.
Puedes probar eliminar la base de datos, borra los archivos de la carpeta "data" que se encuentra en el raiz del proyecto, pero antes haz un back up por si el error no es debido a eso.
Saludos.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hola, muchas gracias por tu ayuda :). He migrado a un proyecto nuevo, y solo migrando las clases, tienes razón, funciona perfecto. Este paso me ayudó a detectar que el problema puede reproducirse desde ese punto al añadir un formatter de fecha personalizado o al añadir un custom.css. Luego, aunque elimine los formatters, el custom.css, la carpeta data o haga mvn clean e install, el error sigue sucediendo. Intenté conectarme a dos motores de bases de datos distintos de HSQLDB (PosgreSQL y SQL Server) y el error persiste.
A este punto sospecho que mi instalación de OpenXava Studio está corrupta. Dejo los códigos por aquí si son de ayuda:
editors.xml
<?xml version = "1.0" encoding = "ISO-8859-1"?><!DOCTYPE editors SYSTEM "dtds/editors.dtd"><editors><editorname="MyDate"url="dateCalendarEditor.jsp"><formatterclass="acbr.sonoimagen.sonoimagen.formatters.LocalDateFormatter"/><for-typetype="java.time.LocalDate"/></editor></editors>
No debería dar error por css. En la traza decia
java.lang.IllegalArgumentException: argument type mismatch
digamos que se está intentando presentar una propiedad con un tipo incorrecto.
Quizá sea por el type que has adjuntado en editors.xml.
Porqué tuviste que agregar un LocalDateFormatter para un tipo LocalDate?
Saludos.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hola, ahora entiendo mejor. Tuve que adjuntar este formatter siguiendo un hilo del foro para asegurarme que los datos se muestren correctamente independientemente de la configuración regional de fecha del navegador. Pasa que la base de datos debe ser compartida con microservicios que conectan una app Android, y estos utilizan el formato yyyy-MM-dd. Si el navegador no parsea la fecha en formato yyyy-MM-dd, entonces la app OX no lee el campo fecha desde la bd y tampoco puede guardar, entonces el formatter está ahí para asegurarse de que siempre se parsee así.
Para probar el funcionamiento del formatter, borré las bd existentes, creé una única para OpenXava, e intenté @ManyToOne (fetch = fetchType.LAZY) Estudio estudio y todo funciona perfectamente, mientras que si hago lo mismo y vuelvo a @ManyToMany, sigo obteniendo el error. Por último intenté quitar el campo fecha en Visita utilizando esta última relación y no tuvo efecto.
Hice el mismo experimento en la base de datos compartida y obtuve los mismos resultados, incluso me aseguré de que la capa modelo de los microservicios estuviera igual que en OX por si el problema era que las tablas no estaban iguales al usar ambas cosas.
En resumen, la única relación que no funciona después del formatter es ManyToMany.
Muchas gracias por tu paciencia, saludos
Last edit: Nora 2024-08-07
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Claro, en muchos bd por defecto los formatos de fecha son yyyy-MM-dd y OX lo procesa sin problemas.
Antes que nada, había probado tu formatter y no me anduvo, por lo que creé un nuevo proyecto usando el formatter que trae por defecto OX.
OX usa HSQLDB, que para LocalDate crea una columna de tipo date y lo guarda a su manera, pero OX al leerlo, lo obtiene como formato yyyy-MM-dd, en esta parte trabaja bien.
Así que para asegurarme, me conecte a MySQL y por defecto tambien es una columna de tipo DATE y guarda los datos en forma 'yyyy-MM-dd', el formatter original tambien trabaja bien leyendo y guardando fechas en la base de datos con ese format por defecto (imagen adjunta).
Cómo tienes la columna de fechas y en que bd lo estas usando? Quizá la diferencia esté aquí, ya que con lo probado anteriormente no deberia hacer falta crear otro formatter.
El otro dia probe el @ManyToMany, de esta manera y funcionaba, pero comente el calculator de hora. Cabe aclarar que lo probe con MySQL y las tablas generadas automaticamente, quizá halla diferencia con las tuyas por eso no me da error.
Hola!! Muchas gracias por explicarme lo del formatter, pasa que sin él obtenía un error de "No es posible convertir fecha en Visita en texto", lamentablemente ya no pude reproducir el error para obtener la traza. Ahora descargué la última versión de OX, volví a crear la base de datos en PostgreSQL, cloné el proyecto y todo está perfecto sin el formatter. El error era persistente cuando utilizaba SQL Server, pero cambiando de motor esto se solucionó.
Abajo adjunto el formato de la columna fecha y también las relaciones entre tablas que a mi parecer están bien definidas, son las creadas automáticamente
Aquí está un link del proyecto, hice dos branches, en el branch master utilizo @ManyToOne, pero en el branch manytomany se encuentra la versión con el problema restante: https://github.com/evanessscence/sonoimagen.git
Hola Nora,
Estuve probando un poco el branch manytomany en el commit Fixed bug where the current date didn't show properly.
Para lograr que me funcionara, cambie
Probe con dejar alguno de ellos y ambos dan error, así que dejé el fechaCalculator y fui directamente al LocalDateFormatter que tienes para ver cual era el error.
El método format en pocas palabras se dedica a leer y transcribir para mostrar en pantalla, entonces el dato que entra es '2024-08-13' y lo transforma al final en '13/08/2024' mientras que el formatter original devuelve otro formato.
Viendo la ultima linea del método format, mude el formatter del calculador al formateador, ya que el trabajo debería estar allí. En vez de formatear como OpenXava lo hacía, lo formatea a tu manera.
Ahí funcionó el módulo, se mostro sin problemas y se pudo guardar, obviamente no hice más pruebas.
Al alterar el formateador, funciona unicamente con navegador en español y se visualiza mal en otros idiomas. Quizá se pueda adaptar para otros idiomas, pero ya hay que debuggear. Por ejemplo hacer un Locale.getCurrent() en format y en caso que el navegador sea español usar tu formateo y dejar los otros idiomas como estaba antes, algo que se me ocurrió ahora.
Para el caso de LocalTime, quizá sea algo similar, no estoy seguro.
Ahora porqué solo funciona mal cuando hay un ManyToMany, ni idea.
Quizá ya había problema antes (por los formatos de fechas), solo que faltaba la última paja para aplastar al camello y eso fue el ManyToMany.
Así que no sería un bug.
Saludos.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hola Chungyen, muchas gracias. Ese era el principal problema. Al cambiar de motor, modificar las calculadoras y eliminar el formatter todo funciona a la perfección. Me voy con mil conocimientos más sobre OX gracias a este hilo, mil gracias por tu tiempo y paciencia al ayudarme. Saludos!!
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hola, soy nueva programando y estoy intentando trabajar con dos clases: Visita y Estudio. Cada Visita debe tener una colección de Estudios realizados. Pasa que cuando intento utilizar @ManyToMany, recibo un error y no entiendo por qué. Es específicamente con esta relación, ya que @OneToOne, @OneToMany y @ManyToOne funcionan perfectamente.
El error sucede cuando entro al tab de Visita, sin embargo, el tab de Estudio funciona perfectamente (puedo ver, agregar y modificar estudios). Borré las tablas implicadas suponiendo que era un problema de la base de datos, también actualicé a la última versión de OpenXava, pero el problema persiste. Acá dejo las clases, la traza y una foto del navegador cuando sucede. Gracias de antemano si alguien puede ayudarme y decirme qué puedo modificar de una forma detallada porque aún no sé mucho :).
Traza
Clase Visita
Clase Estudio
Por si es de ayuda, la clase Identificable:
Por último, adjunto una screenshot del navegador:
Hola Nora,
He probado el codigo en un proyecto nuevo y ha funcionado sin problemas, habría que depurar un poco más, sospecho que quiza al cambiar las relaciones varias veces, produjo un erro en la base de datos, aunque no estoy seguro.
Puedes probar eliminar la base de datos, borra los archivos de la carpeta "data" que se encuentra en el raiz del proyecto, pero antes haz un back up por si el error no es debido a eso.
Saludos.
Hola, muchas gracias por tu ayuda :). He migrado a un proyecto nuevo, y solo migrando las clases, tienes razón, funciona perfecto. Este paso me ayudó a detectar que el problema puede reproducirse desde ese punto al añadir un formatter de fecha personalizado o al añadir un custom.css. Luego, aunque elimine los formatters, el custom.css, la carpeta data o haga mvn clean e install, el error sigue sucediendo. Intenté conectarme a dos motores de bases de datos distintos de HSQLDB (PosgreSQL y SQL Server) y el error persiste.
A este punto sospecho que mi instalación de OpenXava Studio está corrupta. Dejo los códigos por aquí si son de ayuda:
editors.xml
LocalDateFormatter.java
Custom.css
Gracias nuevamente!!
Hola Nora,
No debería dar error por css. En la traza decia
java.lang.IllegalArgumentException: argument type mismatch
digamos que se está intentando presentar una propiedad con un tipo incorrecto.
Quizá sea por el type que has adjuntado en editors.xml.
Porqué tuviste que agregar un LocalDateFormatter para un tipo LocalDate?
Saludos.
Hola, ahora entiendo mejor. Tuve que adjuntar este formatter siguiendo un hilo del foro para asegurarme que los datos se muestren correctamente independientemente de la configuración regional de fecha del navegador. Pasa que la base de datos debe ser compartida con microservicios que conectan una app Android, y estos utilizan el formato yyyy-MM-dd. Si el navegador no parsea la fecha en formato yyyy-MM-dd, entonces la app OX no lee el campo fecha desde la bd y tampoco puede guardar, entonces el formatter está ahí para asegurarse de que siempre se parsee así.
Para probar el funcionamiento del formatter, borré las bd existentes, creé una única para OpenXava, e intenté
@ManyToOne (fetch = fetchType.LAZY) Estudio estudio
y todo funciona perfectamente, mientras que si hago lo mismo y vuelvo a @ManyToMany, sigo obteniendo el error. Por último intenté quitar el campo fecha en Visita utilizando esta última relación y no tuvo efecto.Hice el mismo experimento en la base de datos compartida y obtuve los mismos resultados, incluso me aseguré de que la capa modelo de los microservicios estuviera igual que en OX por si el problema era que las tablas no estaban iguales al usar ambas cosas.
En resumen, la única relación que no funciona después del formatter es ManyToMany.
Muchas gracias por tu paciencia, saludos
Last edit: Nora 2024-08-07
Hola Nora,
Claro, en muchos bd por defecto los formatos de fecha son yyyy-MM-dd y OX lo procesa sin problemas.
Antes que nada, había probado tu formatter y no me anduvo, por lo que creé un nuevo proyecto usando el formatter que trae por defecto OX.
Cómo tienes la columna de fechas y en que bd lo estas usando? Quizá la diferencia esté aquí, ya que con lo probado anteriormente no deberia hacer falta crear otro formatter.
El otro dia probe el @ManyToMany, de esta manera y funcionaba, pero comente el calculator de hora. Cabe aclarar que lo probe con MySQL y las tablas generadas automaticamente, quizá halla diferencia con las tuyas por eso no me da error.
En todo caso, puedes hacer un pequeño proyecto con el código suficiente que te causa error y me lo adjuntas así lo pruebo.
Saludos.
Last edit: Chungyen Tsai 2024-08-12
Hola!! Muchas gracias por explicarme lo del formatter, pasa que sin él obtenía un error de "No es posible convertir fecha en Visita en texto", lamentablemente ya no pude reproducir el error para obtener la traza. Ahora descargué la última versión de OX, volví a crear la base de datos en PostgreSQL, cloné el proyecto y todo está perfecto sin el formatter. El error era persistente cuando utilizaba SQL Server, pero cambiando de motor esto se solucionó.
Abajo adjunto el formato de la columna fecha y también las relaciones entre tablas que a mi parecer están bien definidas, son las creadas automáticamente
Aquí está un link del proyecto, hice dos branches, en el branch master utilizo @ManyToOne, pero en el branch manytomany se encuentra la versión con el problema restante: https://github.com/evanessscence/sonoimagen.git
Saludos
Hola Nora,
Estuve probando un poco el branch manytomany en el commit Fixed bug where the current date didn't show properly.
Para lograr que me funcionara, cambie
Por
También tuve que comentar los dos calculadores:
Probe con dejar alguno de ellos y ambos dan error, así que dejé el fechaCalculator y fui directamente al LocalDateFormatter que tienes para ver cual era el error.
El método format en pocas palabras se dedica a leer y transcribir para mostrar en pantalla, entonces el dato que entra es '2024-08-13' y lo transforma al final en '13/08/2024' mientras que el formatter original devuelve otro formato.
Viendo la ultima linea del método format, mude el formatter del calculador al formateador, ya que el trabajo debería estar allí. En vez de formatear como OpenXava lo hacía, lo formatea a tu manera.
El calculador queda así, digamos que igual a CurrentLocalDateCalculator.
Ahí funcionó el módulo, se mostro sin problemas y se pudo guardar, obviamente no hice más pruebas.
Al alterar el formateador, funciona unicamente con navegador en español y se visualiza mal en otros idiomas. Quizá se pueda adaptar para otros idiomas, pero ya hay que debuggear. Por ejemplo hacer un Locale.getCurrent() en format y en caso que el navegador sea español usar tu formateo y dejar los otros idiomas como estaba antes, algo que se me ocurrió ahora.
Para el caso de LocalTime, quizá sea algo similar, no estoy seguro.
Ahora porqué solo funciona mal cuando hay un ManyToMany, ni idea.
Quizá ya había problema antes (por los formatos de fechas), solo que faltaba la última paja para aplastar al camello y eso fue el ManyToMany.
Así que no sería un bug.
Saludos.
Hola Chungyen, muchas gracias. Ese era el principal problema. Al cambiar de motor, modificar las calculadoras y eliminar el formatter todo funciona a la perfección. Me voy con mil conocimientos más sobre OX gracias a este hilo, mil gracias por tu tiempo y paciencia al ayudarme. Saludos!!