librerias para Chart en grails

250 views
Skip to first unread message

Edwin Farfan

unread,
Nov 25, 2011, 11:40:00 AM11/25/11
to grailsEnCastellano
hola a todos.

Me gustaria que me recomienden algun plugin para hacer graficos
estadisticos en grails.

Estube viendo el plugin de "Google Visualization API Plugin" pero no
me funciono y el plugin de "Google Chart Plugin" he ejecutado su
ejemplo y es muy lento.

Quisiera saber que otras opciones tengo para hacer gráficos.


De antemano Gracias.

Rafael Gutiérrez

unread,
Nov 25, 2011, 12:17:45 PM11/25/11
to grailsenc...@googlegroups.com
Existe highcharts (http://www.highcharts.com/), aunque que yo sepa aun no hay un plugin para Grails.

Saludos

2011/11/25 Edwin Farfan <edwi...@gmail.com>

--
Has recibido este mensaje porque estás suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a grailsenc...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a grailsencastell...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.


Silvio Bravo Cadó

unread,
Nov 25, 2011, 12:29:51 PM11/25/11
to grailsenc...@googlegroups.com
Yo he usado highcharts y ha ido muy bien, es un .js y funciona con jquery. Puedes pasarle los datos por json desde javascript, ya sea que los llames por ajax o que los carges en un hidden cuando pases por la vista y de ahi los recuperas con javascript.

Un saludo.



2011/11/25 Rafael Gutiérrez <abadon.g...@gmail.com>



--



Ing. Silvio Bravo Cadó

Desarrollo de Software
Tlaltek S.A de C.V
(229) 9 2 1 1 3 2 6 ext. 102.
Veracruz, México.

Tana

unread,
Nov 25, 2011, 5:50:47 PM11/25/11
to grailsenc...@googlegroups.com
Hola,

no conozco ningún plugin específico para Grails. Todo lo que he visto son librerías javascript en las que tienes que cargar los datos en javascript directamente o json. Además de highcharts y Google Visualization API (que envía tus datos al servidor de Google para devolver la gráfica) están gRaphäel (http://g.raphaeljs.com) y D3.js (antes Protovis), esta última es muy potente pero para mí complicada porque la sintaxis es declarativa.

Saludos, Tana.



2011/11/25 Silvio Bravo Cadó <brav...@gmail.com>

Carlos Rico Avendaño

unread,
Nov 26, 2011, 9:22:32 AM11/26/11
to grailsenc...@googlegroups.com
Yo he usado los de google y me funcionan correctamente; y de los que he visto son los que mejor funcionalidad aportan.

2011/11/25 Tana <cho...@gmail.com>



--
Un saludo,
Carlos Rico
Observatorio de Grails

Neider Tapia

unread,
Jul 31, 2012, 2:09:26 PM7/31/12
to grailsenc...@googlegroups.com
Buenas tardes.

Podrias publicar un ejemplo para el envio de datos desde el controladdor.

Saludos y gracias

El viernes, 25 de noviembre de 2011 12:29:51 UTC-5, Pikino escribió:
Yo he usado highcharts y ha ido muy bien, es un .js y funciona con jquery. Puedes pasarle los datos por json desde javascript, ya sea que los llames por ajax o que los carges en un hidden cuando pases por la vista y de ahi los recuperas con javascript.

Un saludo.



2011/11/25 Rafael Gutiérrez <abadon.g...@gmail.com>
Existe highcharts (http://www.highcharts.com/), aunque que yo sepa aun no hay un plugin para Grails.

Saludos


2011/11/25 Edwin Farfan <edwi...@gmail.com>
hola a todos.

Me gustaria que me recomienden algun plugin para hacer graficos
estadisticos en grails.

Estube viendo el plugin de "Google Visualization API Plugin" pero no
me funciono y el plugin de "Google Chart Plugin" he ejecutado su
ejemplo y es muy lento.

Quisiera saber que otras opciones tengo para hacer gráficos.


De antemano Gracias.

--
Has recibido este mensaje porque estás suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a grailsencastellano@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a grailsencastellano+unsub...@googlegroups.com

Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.

--
Has recibido este mensaje porque estás suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a grailsencastellano@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a grailsencastellano+unsub...@googlegroups.com

Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.

JhonFx

unread,
Aug 1, 2012, 2:42:32 PM8/1/12
to grailsenc...@googlegroups.com
Yo he usado un poco de highcharts y la verdad es muy bueno, no lo use directamente con grails pero lo único que necesitas es devolver datos en formato json desde el controler y ya en la vista con un ajax recuperas los datos mismos que vas a representar sobre la gráfica, solo bájate la librería de  highcharts, hay veces que para este tipo de cosas no necesitas forzosamente un plugin de grails.

Jimmy Valverde Sanchez

unread,
Aug 1, 2012, 2:45:51 PM8/1/12
to grailsenc...@googlegroups.com
Sólo tener en cuenta el tema de "licencias" en http://shop.highsoft.com/highcharts.html

2012/8/1 JhonFx <jhon...@gmail.com>
Yo he usado un poco de highcharts y la verdad es muy bueno, no lo use directamente con grails pero lo único que necesitas es devolver datos en formato json desde el controler y ya en la vista con un ajax recuperas los datos mismos que vas a representar sobre la gráfica, solo bájate la librería de  highcharts, hay veces que para este tipo de cosas no necesitas forzosamente un plugin de grails.

--
Has recibido este mensaje porque estás suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para ver este debate en la Web, visita https://groups.google.com/d/msg/grailsencastellano/-/jC3mQu36TVwJ.

Para publicar una entrada en este grupo, envía un correo electrónico a grailsenc...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a grailsencastell...@googlegroups.com

Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.



--
------------------------------------------------------------
Jimmy Valverde Sánchez
Phone: +51 959928476
gtalk/msn: sirg...@gmail.com
msn: sirg...@sirghost.net
ym: jvalverdesanchez
skype: sirghostx
http://sirghost.net

Antonio Mas

unread,
Aug 9, 2012, 4:55:20 AM8/9/12
to grailsenc...@googlegroups.com
Hola,

Estoy haciendo ejercicios para mejorar mi kun fu con el desarrallo de grails pero creo que no llego ni a cinturón blanco-amarillo.
Os presento mi problema:
tengo estas relaciones:

Account (relación 1-1 con MoneyInfo, siendo Account la owner)
MoneyInfo (relación 1-1 con Account, 1-1 con TransactionLegInfo, en ambas como owned)
TransactionLegInfo (Relación 1-1 con MoneyInfo siendo TransactionLegInfo owner, y 1-M con transactionInfo)
TransactionInfo (Relación 1-M con TransactionLegInfo)

los atributos en las clases están como:
Account:
     String accountRef
     static hasOne = [balance:MoneyInfo]

MoneyInfo:
    BigDecimal amount
    String currencyRef
    static belongsTo = [accountRef:Account, leg:TransactionLegInfo]

TransactionLegInfo:
    String accountRef
    static hasOne = [amount:MoneyInfo]
    static belongsTo = [transactionInfo:TransactionInfo]

TransactionInfo:
    String transactionRef
    String transactionType
    Date bookingDate
    static hasMany = [legs:TransactionLegInfo]

El problema que tengo es que en los test de integración cuando creo una account y la salvo no muestra ningún mensaje de error pero luego cuando intento hacer un Account.findByAccountRef(ACCOUNT_REF) o un Account.list() no encuentra ningún registro.

He probado en groovyConsole y el problema es que no persiste la información en la base de datos.

groovy> import com.company.area.bank.*
groovy> def money = new MoneyInfo(amount:200.00, currencyRef:'USD')
groovy> def account = new Account(acountRef: 'ACC1', balance:money)
groovy> account.save()
groovy> Account.list()
 
Result: []

¿Alguien me puede arrojar un poco de luz sobre este problema?

Saludos,
Toni

Alberto Vilches

unread,
Aug 9, 2012, 5:00:27 AM8/9/12
to grailsenc...@googlegroups.com
Mira a ver si después de crear tu Account el método hasErrors() devuelve true. O haz el save con account.save(failOnError:true)

2012/8/9 Antonio Mas <dquij...@gmail.com>

--
Has recibido este mensaje porque estás suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a grailsenc...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a grailsencastell...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.



--
Un saludo.
Alberto Vilches
Twitter: @albertovilches

Antonio Mas

unread,
Aug 9, 2012, 5:55:22 AM8/9/12
to grailsenc...@googlegroups.com
Muchas gracias Alberto por el apunte,

Ahora por lo menos se que está fallando... aunque no entiendo muy bien por qué.
Este es el mensaje de error:
Exception thrown

grails.validation.ValidationException: Validation Error(s) occurred during save():
- Field error in object 'com.company.app.bank.Account' on field 'accountRef': rejected value [null]; codes [com.company.app.bank.Account.accountRef.nullable.error.com.company.app.bank.Account.accountRef,com.company.app.bank.Account.accountRef.nullable.error.accountRef,com.company.app.bank.Account.accountRef.nullable.error.java.lang.String,com.company.app.bank.Account.accountRef.nullable.error,account.accountRef.nullable.error.com.company.app.bank.Account.accountRef,account.accountRef.nullable.error.accountRef,account.accountRef.nullable.error.java.lang.String,account.accountRef.nullable.error,com.company.app.bank.Account.accountRef.nullable.com.company.app.bank.Account.accountRef,com.company.app.bank.Account.accountRef.nullable.accountRef,com.company.app.bank.Account.accountRef.nullable.java.lang.String,com.company.app.bank.Account.accountRef.nullable,account.accountRef.nullable.com.company.app.bank.Account.accountRef,account.accountRef.nullable.accountRef,account.accountRef.nullable.java.lang.String,account.accountRef.nullable,nullable.com.company.app.bank.Account.accountRef,nulla ble.accountRef,nullable.java.lang.String,nullable]; arguments [accountRef,class com.company.app.bank.Account]; default message [La propiedad [{0}] de la clase [{1}] no puede ser nulo]
- Field error in object 'com.company.app.bank.Account' on field 'balance.leg': rejected value [null]; codes [com.company.app.bank.MoneyInfo.leg.nullable.error.com.company.app.bank.Account.balance.leg,com.company.app.bank.MoneyInfo.leg.nullable.error.balance.leg,com.company.app.bank.MoneyInfo.leg.nullable.error.leg,com.company.app.bank.MoneyInfo.leg.nullable.error.com.company.app.bank.TransactionLegInfo,com.company.app.bank.MoneyInfo.leg.nullable.error,moneyInfo.leg.nullable.error.com.company.app.bank.Account.balance.leg,moneyInfo.leg.nullable.error.balance.leg,moneyInfo.leg.nullable.error.leg,moneyInfo.leg.nullable.error.com.company.app.bank.TransactionLegInfo,moneyInfo.leg.nullable.error,com.company.app.bank.MoneyInfo.leg.nullable.com.company.app.bank.Account.balance.leg,com.company.app.bank.MoneyInfo.leg.nullable.balance.leg,com.company.app.bank.MoneyInfo.leg.nullable.leg,com.company.app.bank.MoneyInfo.leg.nullable.com.company.app.bank.TransactionLegInfo,com.company.app.bank.MoneyInfo.leg.nullable,moneyInfo.leg.nullable.com.company.app.bank.Account.balance.leg,moneyInfo.leg.nullab le.balance.leg,moneyInfo.leg.nullable.leg,moneyInfo.leg.nullable.com.company.app.bank.TransactionLegInfo,moneyInfo.leg.nullable,nullable.com.company.app.bank.Account.balance.leg,nullable.balance.leg,nullable.leg,nullable.com.company.app.bank.TransactionLegInfo,nullable]; arguments [leg,class com.company.app.bank.MoneyInfo]; default message [La propiedad [{0}] de la clase [{1}] no puede ser nulo]

    at com.company.app.bank.Account.save(Account.groovy)
    at com.company.app.bank.Account$save$0.call(Unknown Source)
    at ConsoleScript3.run(ConsoleScript3:6)

las constraints en Account:
static constraints = {
        accountRef unique:true, blank:false, nullable:false
        balance (validator:  {return (it.amount > -1)}, nullable:false)  // el saldo no puede ser negativo
    }

Y las constraints en TransactionInfo:
static constraints = {
        legs validator: {return (it.size() >=2)} // La transferencia tiene que tener como mínimo 2 cuentas
    }
En las demás clases no hay constraints (aunque no he eliminado la closure)
No entiendo por qué considera como null el balance y el accountRef cuando le he pasado al constructor el map para inicializarlo ...

No quiero abusar, pero si alguien ve el problema ...

Muchas gracias y saludos
Toni


El 09/08/12 11:00, Alberto Vilches escribió:

Laura Morillo-Velarde Rodríguez

unread,
Aug 9, 2012, 6:01:14 AM8/9/12
to grailsenc...@googlegroups.com
Estaría bien tener el código de dónde estás creando esas instancias para poder hacernos mejor una idea de por qué se están quedando a null.

Saludos.

Laura

Antonio Mas

unread,
Aug 9, 2012, 6:04:56 AM8/9/12
to grailsenc...@googlegroups.com
Hola,

Lo he probado en la consola de groovy, lo puse en el primer mail, pero se perdió en los siguientes. Lo he vuelto a ejecutar con failOnError:true en el save() como sabiamente ha sugerido Alberto.


groovy> import com.company.area.bank.*
groovy> def money = new MoneyInfo(amount:200.00, currencyRef:'USD')
groovy> def account = new Account(acountRef: 'ACC1', balance:money)
groovy> account.save()
groovy> Account.list()
 
Result: []
Puedo meter las clases también si es necesario, pero no quería meter mucho ruido...

El 09/08/12 12:01, Laura Morillo-Velarde Rodríguez escribió:
Estaría bien tener el código de dónde estás creando esas instancias para poder hacernos mejor una idea de por qué se están quedando a null.

Saludos.

Laura



El 9 de agosto de 2012 11:55, Antonio Mas <dquij...@gmail.com> escribió:
Muchas gracias Alberto por el apunte,

Ahora por lo menos se que está fallando... aunque no entiendo muy bien por qué.
Este es el mensaje de error:
Exception thrown

grails.validation.ValidationException: Validation Error(s) occurred during save():
- Field error in object 'com.company.app.bank.Account' on field 'accountRef': rejected value [null]; codes [com.company.app.bank.Account.accountRef.nullable.error.com.company.app.bank.Account.accountRef,com.company.app.bank.Account.accountRef.nullable.error.accountRef,com.company.app.bank.Account.accountRef.nullable.error.java.lang.String,com.company.app.bank.Account.accountRef.nullable.error,account.accountRef.nullable.error.com.company.app.bank.Account.accountRef,account.accountRef.nullable.error.accountRef,account.accountRef.nullable.error.java.lang.String,account.accountRef.nullable.error,com.company.app.bank.Account.accountRef.nullable.com.company.app.bank.Account.accountRef,com.company.app.bank.Account.accountRef.nullable.accountRef,com.company.app.bank.Account.accountRef.nullable.java.lang.String,com.company.app.bank.Account.accountRef.nullable,account.accountRef.nullable.com.company.app.bank.Account.accountRef,account.accountRef.nullable.accountRef,account.accountRef.nullable.java.lang.String,account.accountRef.nullable,nullable.com.company.app.bank.Account.accoun tRef,nulla ble.accountRef,nullable.java.lang.String,nullable]; arguments [accountRef,class com.company.app.bank.Account]; default message [La propiedad [{0}] de la clase [{1}] no puede ser nulo]
- Field error in object 'com.company.app.bank.Account' on field 'balance.leg': rejected value [null]; codes [com.company.app.bank.MoneyInfo.leg.nullable.error.com.company.app.bank.Account.balance.leg,com.company.app.bank.MoneyInfo.leg.nullable.error.balance.leg,com.company.app.bank.MoneyInfo.leg.nullable.error.leg,com.company.app.bank.MoneyInfo.leg.nullable.error.com.company.app.bank.TransactionLegInfo,com.company.app.bank.MoneyInfo.leg.nullable.error,moneyInfo.leg.nullable.error.com.company.app.bank.Account.balance.leg,moneyInfo.leg.nullable.error.balance.leg,moneyInfo.leg.nullable.error.leg,moneyInfo.leg.nullable.error.com.company.app.bank.TransactionLegInfo,moneyInfo.leg.nullable.error,com.company.app.bank.MoneyInfo.leg.nullable.com.company.app.bank.Account.balance.leg,com.company.app.bank.MoneyInfo.leg.nullable.balance.leg,com.company.app.bank.MoneyInfo.leg.nullable.leg,com.company.app.bank.MoneyInfo.leg.nullable.com.company.app.bank.TransactionLegInfo,com.company.app.bank.MoneyInfo.leg.nullable,moneyInfo.leg.nullable.com.company.app.bank.Account.balance.leg,moneyInfo. leg.nullab le.balance.leg,moneyInfo.leg.nullable.leg,moneyInfo.leg.nullable.com.company.app.bank.TransactionLegInfo,moneyInfo.leg.nullable,nullable.com.company.app.bank.Account.balance.leg,nullable.balance.leg,nullable.leg,nullable.com.company.app.bank.TransactionLegInfo,nullable]; arguments [leg,class com.company.app.bank.MoneyInfo]; default message [La propiedad [{0}] de la clase [{1}] no puede ser nulo]

Jorge Jiménez

unread,
Aug 9, 2012, 6:10:45 AM8/9/12
to grailsenc...@googlegroups.com
Antonio, veo que la clase tiene una propiedad accountRef, pero en consola has puesto:
def account = new Account(acountRef: 'ACC1', balance:money) 
Puede que te falte una 'c' en el nombre de la propiedad… accountRef.

Vamos, lo digo por el error, que te indica que es nulo y salta la constraint.

Un saludo,

Jorge Jiménez

Alberto Vilches

unread,
Aug 9, 2012, 6:41:25 AM8/9/12
to grailsenc...@googlegroups.com
SI, ademas falta el leg en MoneyInfo

def money = new MoneyInfo(amount:200.00, currencyRef:'USD', leg:new MoneyInfo(....).save()) 

2012/8/9 Jorge Jiménez <sem...@gmail.com>

Antonio Mas

unread,
Aug 9, 2012, 10:09:10 AM8/9/12
to grailsenc...@googlegroups.com
Hola,

Muchas gracias por los comentarios one more time!!!

No se si es que he montado mal las relaciones entre las clases del modelo, pero tengo muchos problemas (y tampoco tengo muy claro cuando se adjuntan autom�ticamente los objetos en la relaciones)

Pero parece cuando intento salvar un objeto MoneyInfo falla porque no puede insertar null para el id del TransactionLegInfo y el Account, pero cuando intento salvar primero el Account o el TransactionLegInfo intenta crear el MoneyInfo y falla por lo mismo.

Puede ser que haya creado de forma incorrecta las relaciones en el modelo?

Pongo la declaraci�n de los atributos aqu� por si alg�n alma piadosa tiene comentarios, consejos, una p�cima, un hechizo...
...Me est� entrando un sentimiento de "te quiero pero te odio" con grails...


los atributos en las clases est�n como:
Account:
���� String accountRef
���� static hasOne = [balance:MoneyInfo]

MoneyInfo:
��� BigDecimal amount
��� String currencyRef
��� static belongsTo = [accountRef:Account, leg:TransactionLegInfo]

TransactionLegInfo:
��� String accountRef
��� static hasOne = [amount:MoneyInfo]
��� static belongsTo = [transactionInfo:TransactionInfo]

TransactionInfo:
��� String transactionRef
��� String transactionType
��� Date bookingDate
��� static hasMany = [legs:TransactionLegInfo]

Los test en la consola:

groovy> import com.company.app.bank.*
groovy> def tinfo = new TransactionInfo(transactionRef:'tref', transactionType:'ttype', bookingDate: new Date())
groovy> def account = new Account(accountRef: 'ACC1')
groovy> def account2 = new Account(accountRef: 'ACC2')
groovy> def tLeg = new TransactionLegInfo(accountRef: 'ACC1')
groovy> def tLeg2 = new TransactionLegInfo(accountRef: 'ACC2')
groovy> def money = new MoneyInfo(amount:200.00, currencyRef:'USD', accountRef:account, leg:tLeg)
groovy> def money2 = new MoneyInfo(amount:300.00, currencyRef:'USD', accountRef:account2, leg:tLeg2)
groovy> tLeg.amount = money
groovy> account.balance = money
groovy> tLeg2.amount = money2
groovy> account2.balance = money2
groovy> tinfo.legs = [tLeg, tLeg2]�
groovy> account.save(failOnError:true)
groovy> account2.save(failOnError:true)
groovy> tLeg.save(failOnError:true)
groovy> tLeg2.save(failOnError:true)
groovy> money.save(failOnError:true)
groovy> money2.save(failOnError:true)
groovy> tinfo.save(failOnError:true)
groovy> TransactionInfo.list()
�
2012-08-09 15:38:40,508 [Thread-14] ERROR util.JDBCExceptionReporter� - La columna "LEG_ID" no permite valores nulos (NULL)
NULL not allowed for column "LEG_ID"; SQL statement:
insert into money_info (id, version, account_ref_id, amount, currency_ref, leg_id) values (null, ?, ?, ?, ?, ?) [23502-164]
Exception thrown

org.springframework.dao.DataIntegrityViolationException: could not insert: [com.company.app.bank.MoneyInfo]; SQL [insert into money_info (id, version, account_ref_id, amount, currency_ref, leg_id) values (null, ?, ?, ?, ?, ?)]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not insert: [com.company.app.bank.MoneyInfo]
��� at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:641)
��� at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
��� at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)
��� at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:339)
��� at com.company.app.bank.Account.save(Account.groovy)
��� at com.company.app.bank.Account$save.call(Unknown Source)
��� at test-bank.run(test-bank.groovy:22)
Caused by: org.hibernate.exception.ConstraintViolationException: could not insert: [com.company.app.bank.MoneyInfo]
��� at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
��� at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
��� at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:63)
��� at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2346)
��� at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2853)
��� at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
��� at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273)
��� at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203)
��� at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129)
��� at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
��� at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
��� at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117)
��� at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
��� at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:685)
��� at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:677)
��� at org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:252)
��� at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:392)
��� at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:335)
��� at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)
��� at org.hibernate.engine.Cascade.cascade(Cascade.java:161)
��� at org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:475)
��� at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203)
��� at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129)
��� at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
��� at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
��� at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117)
��� at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
��� at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:685)
��� at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:677)
��� at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:673)
��� at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)
��� ... 4 more
Caused by: org.h2.jdbc.JdbcSQLException: La columna "LEG_ID" no permite valores nulos (NULL)
NULL not allowed for column "LEG_ID"; SQL statement:
insert into money_info (id, version, account_ref_id, amount, currency_ref, leg_id) values (null, ?, ?, ?, ?, ?) [23502-164]
��� at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
��� at org.h2.message.DbException.get(DbException.java:169)
��� at org.h2.message.DbException.get(DbException.java:146)
��� at org.h2.table.Column.validateConvertUpdateSequence(Column.java:293)
��� at org.h2.table.Table.validateConvertUpdateSequence(Table.java:680)
��� at org.h2.command.dml.Insert.insertRows(Insert.java:120)
��� at org.h2.command.dml.Insert.update(Insert.java:84)
��� at org.h2.command.CommandContainer.update(CommandContainer.java:73)
��� at org.h2.command.Command.executeUpdate(Command.java:226)
��� at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:143)
��� at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:129)
��� at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
��� at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
��� at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:93)
��� at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:56)
��� ... 32 more


El 09/08/12 12:41, Alberto Vilches escribi�:
SI, ademas falta el leg en MoneyInfo

def money = new MoneyInfo(amount:200.00, currencyRef:'USD', leg:new MoneyInfo(....).save())�

2012/8/9 Jorge Jim�nez <sem...@gmail.com>
Antonio, veo que la clase tiene una propiedad accountRef, pero en consola has puesto:
def account = new Account(acountRef: 'ACC1', balance:money)�
Puede que te falte una 'c' en el nombre de la propiedad� accountRef.

Vamos, lo digo por el error, que te indica que es nulo y salta la constraint.

Un saludo,

Jorge Jim�nez

On Aug 9, 2012, at 11:55 AM, Antonio Mas <dquij...@gmail.com> wrote:

Muchas gracias Alberto por el apunte,

Ahora por lo menos se que est� fallando... aunque no entiendo muy bien por qu�.

Este es el mensaje de error:
Exception thrown

grails.validation.ValidationException: Validation Error(s) occurred during save():
- Field error in object 'com.company.app.bank.Account' on field 'accountRef': rejected value [null]; codes [com.company.app.bank.Account.accountRef.nullable.error.com.company.app.bank.Account.accountRef,com.company.app.bank.Account.accountRef.nullable.error.accountRef,com.company.app.bank.Account.accountRef.nullable.error.java.lang.String,com.company.app.bank.Account.accountRef.nullable.error,account.accountRef.nullable.error.com.company.app.bank.Account.accountRef,account.accountRef.nullable.error.accountRef,account.accountRef.nullable.error.java.lang.String,account.accountRef.nullable.error,com.company.app.bank.Account.accountRef.nullable.com.company.app.bank.Account.accountRef,com.company.app.bank.Account.accountRef.nullable.accountRef,com.company.app.bank.Account.accountRef.nullable.java.lang.String,com.company.app.bank.Account.accountRef.nullable,account.accountRef.nullable.com.company.app.bank.Account.accountRef,account.accountRef.nullable.accountRef,account.accountRef.nullable.java.lang.String,account.accountRef.nullable,nullable.com.company.app.bank.Ac count.accountRef,nulla ble.accountRef,nullable.java.lang.String,nullable]; arguments [accountRef,class com.company.app.bank.Account]; default message [La propiedad [{0}] de la clase [{1}] no puede ser nulo]
- Field error in object 'com.company.app.bank.Account' on field 'balance.leg': rejected value [null]; codes [com.company.app.bank.MoneyInfo.leg.nullable.error.com.company.app.bank.Account.balance.leg,com.company.app.bank.MoneyInfo.leg.nullable.error.balance.leg,com.company.app.bank.MoneyInfo.leg.nullable.error.leg,com.company.app.bank.MoneyInfo.leg.nullable.error.com.company.app.bank.TransactionLegInfo,com.company.app.bank.MoneyInfo.leg.nullable.error,moneyInfo.leg.nullable.error.com.company.app.bank.Account.balance.leg,moneyInfo.leg.nullable.error.balance.leg,moneyInfo.leg.nullable.error.leg,moneyInfo.leg.nullable.error.com.company.app.bank.TransactionLegInfo,moneyInfo.leg.nullable.error,com.company.app.bank.MoneyInfo.leg.nullable.com.company.app.bank.Account.balance.leg,com.company.app.bank.MoneyInfo.leg.nullable.balance.leg,com.company.app.bank.MoneyInfo.leg.nullable.leg,com.company.app.bank.MoneyInfo.leg.nullable.com.company.app.bank.TransactionLegInfo,com.company.app.bank.MoneyInfo.leg.nullable,moneyInfo.leg.nullable.com.company.app.bank.Account.balance.le g,moneyInfo.leg.nullab le.balance.leg,moneyInfo.leg.nullable.leg,moneyInfo.leg.nullable.com.company.app.bank.TransactionLegInfo,moneyInfo.leg.nullable,nullable.com.company.app.bank.Account.balance.leg,nullable.balance.leg,nullable.leg,nullable.com.company.app.bank.TransactionLegInfo,nullable]; arguments [leg,class com.company.app.bank.MoneyInfo]; default message [La propiedad [{0}] de la clase [{1}] no puede ser nulo]

��� at com.company.app.bank.Account.save(Account.groovy)
��� at com.company.app.bank.Account$save$0.call(Unknown Source)
��� at ConsoleScript3.run(ConsoleScript3:6)

las constraints en Account:
static constraints = {
������� accountRef unique:true, blank:false, nullable:false
������� balance (validator:� {return (it.amount > -1)}, nullable:false)� // el saldo no puede ser negativo
��� }

Y las constraints en TransactionInfo:
static constraints = {
������� legs validator: {return (it.size() >=2)} // La transferencia tiene que tener como m�nimo 2 cuentas
��� }
En las dem�s clases no hay constraints (aunque no he eliminado la closure)
No entiendo por qu� considera como null el balance y el accountRef cuando le he pasado al constructor el map para inicializarlo ...


No quiero abusar, pero si alguien ve el problema ...

Muchas gracias y saludos
Toni


El 09/08/12 11:00, Alberto Vilches escribi�:
Mira a ver si despu�s de crear tu Account el m�todo hasErrors() devuelve true. O haz el save con account.save(failOnError:true)

2012/8/9 Antonio Mas <dquij...@gmail.com>
Hola,

Estoy haciendo ejercicios para mejorar mi kun fu con el desarrallo de grails pero creo que no llego ni a cintur�n blanco-amarillo.

Os presento mi problema:
tengo estas relaciones:

Account (relaci�n 1-1 con MoneyInfo, siendo Account la owner)
MoneyInfo (relaci�n 1-1 con Account, 1-1 con TransactionLegInfo, en ambas como owned)
TransactionLegInfo (Relaci�n 1-1 con MoneyInfo siendo TransactionLegInfo owner, y 1-M con transactionInfo)
TransactionInfo (Relaci�n 1-M con TransactionLegInfo)

los atributos en las clases est�n como:
Account:
���� String accountRef
���� static hasOne = [balance:MoneyInfo]

MoneyInfo:
��� BigDecimal amount
��� String currencyRef
��� static belongsTo = [accountRef:Account, leg:TransactionLegInfo]

TransactionLegInfo:
��� String accountRef
��� static hasOne = [amount:MoneyInfo]
��� static belongsTo = [transactionInfo:TransactionInfo]

TransactionInfo:
��� String transactionRef
��� String transactionType
��� Date bookingDate
��� static hasMany = [legs:TransactionLegInfo]

El problema que tengo es que en los test de integraci�n cuando creo una account y la salvo no muestra ning�n mensaje de error pero luego cuando intento hacer un Account.findByAccountRef(ACCOUNT_REF) o un Account.list() no encuentra ning�n registro.

He probado en groovyConsole y el problema es que no persiste la informaci�n en la base de datos.

groovy> import com.company.area.bank.*
groovy> def money = new MoneyInfo(amount:200.00, currencyRef:'USD')
groovy> def account = new Account(acountRef: 'ACC1', balance:money)
groovy> account.save()
groovy> Account.list()
�
Result: []

�Alguien me puede arrojar un poco de luz sobre este problema?

Saludos,
Toni

--
Has recibido este mensaje porque est�s suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, env�a un correo electr�nico a grailsenc...@googlegroups.com.
Para anular tu suscripci�n a este grupo, env�a un correo electr�nico a grailsencastell...@googlegroups.com
Para tener acceso a m�s opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.



--
Un saludo.
Alberto Vilches
Twitter: @albertovilches

--
Has recibido este mensaje porque est�s suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, env�a un correo electr�nico a grailsenc...@googlegroups.com.
Para anular tu suscripci�n a este grupo, env�a un correo electr�nico a grailsencastell...@googlegroups.com
Para tener acceso a m�s opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.


--
Has recibido este mensaje porque est�s suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, env�a un correo electr�nico a grailsenc...@googlegroups.com.
Para anular tu suscripci�n a este grupo, env�a un correo electr�nico a grailsencastell...@googlegroups.com
Para tener acceso a m�s opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.

--
Has recibido este mensaje porque est�s suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, env�a un correo electr�nico a grailsenc...@googlegroups.com.
Para anular tu suscripci�n a este grupo, env�a un correo electr�nico a grailsencastell...@googlegroups.com
Para tener acceso a m�s opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.



--
Un saludo.
Alberto Vilches
Twitter: @albertovilches

--
Has recibido este mensaje porque est�s suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, env�a un correo electr�nico a grailsenc...@googlegroups.com.
Para anular tu suscripci�n a este grupo, env�a un correo electr�nico a grailsencastell...@googlegroups.com
Para tener acceso a m�s opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.

Alberto Vilches

unread,
Aug 9, 2012, 10:31:26 AM8/9/12
to grailsenc...@googlegroups.com
Si tienes una dependencia circular tiene que hacer al menos un de ellas se pueda crear sin que dependa de ninguna otra, y esa crearla primero.

2012/8/9 Antonio Mas <dquij...@gmail.com>
Hola,

Muchas gracias por los comentarios one more time!!!

No se si es que he montado mal las relaciones entre las clases del modelo, pero tengo muchos problemas (y tampoco tengo muy claro cuando se adjuntan automáticamente los objetos en la relaciones)

Pero parece cuando intento salvar un objeto MoneyInfo falla porque no puede insertar null para el id del TransactionLegInfo y el Account, pero cuando intento salvar primero el Account o el TransactionLegInfo intenta crear el MoneyInfo y falla por lo mismo.

Puede ser que haya creado de forma incorrecta las relaciones en el modelo?

Pongo la declaración de los atributos aquí por si algún alma piadosa tiene comentarios, consejos, una pócima, un hechizo...
...Me está entrando un sentimiento de "te quiero pero te odio" con grails...



los atributos en las clases están como:
Account:
     String accountRef
     static hasOne = [balance:MoneyInfo]

MoneyInfo:
    BigDecimal amount
    String currencyRef

    static belongsTo = [accountRef:Account, leg:TransactionLegInfo]

TransactionLegInfo:
    String accountRef

    static hasOne = [amount:MoneyInfo]
    static belongsTo = [transactionInfo:TransactionInfo]

TransactionInfo:
    String transactionRef
    String transactionType
    Date bookingDate
    static hasMany = [legs:TransactionLegInfo]
Los test en la consola:

groovy> import com.company.app.bank.*
groovy> def tinfo = new TransactionInfo(transactionRef:'tref', transactionType:'ttype', bookingDate: new Date())
groovy> def account = new Account(accountRef: 'ACC1')
groovy> def account2 = new Account(accountRef: 'ACC2')
groovy> def tLeg = new TransactionLegInfo(accountRef: 'ACC1')
groovy> def tLeg2 = new TransactionLegInfo(accountRef: 'ACC2')
groovy> def money = new MoneyInfo(amount:200.00, currencyRef:'USD', accountRef:account, leg:tLeg)
groovy> def money2 = new MoneyInfo(amount:300.00, currencyRef:'USD', accountRef:account2, leg:tLeg2)
groovy> tLeg.amount = money
groovy> account.balance = money
groovy> tLeg2.amount = money2
groovy> account2.balance = money2
groovy> tinfo.legs = [tLeg, tLeg2] 
groovy> account.save(failOnError:true)
groovy> account2.save(failOnError:true)
groovy> tLeg.save(failOnError:true)
groovy> tLeg2.save(failOnError:true)
groovy> money.save(failOnError:true)
groovy> money2.save(failOnError:true)
groovy> tinfo.save(failOnError:true)
groovy> TransactionInfo.list()
 
2012-08-09 15:38:40,508 [Thread-14] ERROR util.JDBCExceptionReporter  - La columna "LEG_ID" no permite valores nulos (NULL)

NULL not allowed for column "LEG_ID"; SQL statement:
insert into money_info (id, version, account_ref_id, amount, currency_ref, leg_id) values (null, ?, ?, ?, ?, ?) [23502-164]
Exception thrown

org.springframework.dao.DataIntegrityViolationException: could not insert: [com.company.app.bank.MoneyInfo]; SQL [insert into money_info (id, version, account_ref_id, amount, currency_ref, leg_id) values (null, ?, ?, ?, ?, ?)]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not insert: [com.company.app.bank.MoneyInfo]
    at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:641)
    at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)
    at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:339)
    at com.company.app.bank.Account.save(Account.groovy)
    at com.company.app.bank.Account$save.call(Unknown Source)

    at test-bank.run(test-bank.groovy:22)
Caused by: org.hibernate.exception.ConstraintViolationException: could not insert: [com.company.app.bank.MoneyInfo]
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:63)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2346)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2853)
    at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273)
    at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203)
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
    at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:685)
    at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:677)
    at org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:252)
    at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:392)
    at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:335)
    at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)
    at org.hibernate.engine.Cascade.cascade(Cascade.java:161)
    at org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:475)
    at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203)
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
    at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:685)
    at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:677)
    at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:673)
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)

    ... 4 more
Caused by: org.h2.jdbc.JdbcSQLException: La columna "LEG_ID" no permite valores nulos (NULL)
NULL not allowed for column "LEG_ID"; SQL statement:
insert into money_info (id, version, account_ref_id, amount, currency_ref, leg_id) values (null, ?, ?, ?, ?, ?) [23502-164]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
    at org.h2.message.DbException.get(DbException.java:169)
    at org.h2.message.DbException.get(DbException.java:146)
    at org.h2.table.Column.validateConvertUpdateSequence(Column.java:293)
    at org.h2.table.Table.validateConvertUpdateSequence(Table.java:680)
    at org.h2.command.dml.Insert.insertRows(Insert.java:120)
    at org.h2.command.dml.Insert.update(Insert.java:84)
    at org.h2.command.CommandContainer.update(CommandContainer.java:73)
    at org.h2.command.Command.executeUpdate(Command.java:226)
    at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:143)
    at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:129)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
    at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:93)
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:56)
    ... 32 more


El 09/08/12 12:41, Alberto Vilches escribió:
SI, ademas falta el leg en MoneyInfo

def money = new MoneyInfo(amount:200.00, currencyRef:'USD', leg:new MoneyInfo(....).save()) 

2012/8/9 Jorge Jiménez <sem...@gmail.com>
Antonio, veo que la clase tiene una propiedad accountRef, pero en consola has puesto:
def account = new Account(acountRef: 'ACC1', balance:money) 
Puede que te falte una 'c' en el nombre de la propiedad… accountRef.

Vamos, lo digo por el error, que te indica que es nulo y salta la constraint.

Un saludo,

Jorge Jiménez

On Aug 9, 2012, at 11:55 AM, Antonio Mas <dquij...@gmail.com> wrote:

Muchas gracias Alberto por el apunte,

Ahora por lo menos se que está fallando... aunque no entiendo muy bien por qué.

Este es el mensaje de error:
Exception thrown

grails.validation.ValidationException: Validation Error(s) occurred during save():
- Field error in object 'com.company.app.bank.Account' on field 'accountRef': rejected value [null]; codes [com.company.app.bank.Account.accountRef.nullable.error.com.company.app.bank.Account.accountRef,com.company.app.bank.Account.accountRef.nullable.error.accountRef,com.company.app.bank.Account.accountRef.nullable.error.java.lang.String,com.company.app.bank.Account.accountRef.nullable.error,account.accountRef.nullable.error.com.company.app.bank.Account.accountRef,account.accountRef.nullable.error.accountRef,account.accountRef.nullable.error.java.lang.String,account.accountRef.nullable.error,com.company.app.bank.Account.accountRef.nullable.com.company.app.bank.Account.accountRef,com.company.app.bank.Account.accountRef.nullable.accountRef,com.company.app.bank.Account.accountRef.nullable.java.lang.String,com.company.app.bank.Account.accountRef.nullable,account.accountRef.nullable.com.company.app.bank.Account.accountRef,account.accountRef.nullable.accountRef,account.accountRef.nullable.java.lang.String,account.accountRef.nullable,nullable.com.company.app.bank.Ac count.accountRef,nulla ble.accountRef,nullable.java.lang.String,nullable]; arguments [accountRef,class com.company.app.bank.Account]; default message [La propiedad [{0}] de la clase [{1}] no puede ser nulo]
- Field error in object 'com.company.app.bank.Account' on field 'balance.leg': rejected value [null]; codes [com.company.app.bank.MoneyInfo.leg.nullable.error.com.company.app.bank.Account.balance.leg,com.company.app.bank.MoneyInfo.leg.nullable.error.balance.leg,com.company.app.bank.MoneyInfo.leg.nullable.error.leg,com.company.app.bank.MoneyInfo.leg.nullable.error.com.company.app.bank.TransactionLegInfo,com.company.app.bank.MoneyInfo.leg.nullable.error,moneyInfo.leg.nullable.error.com.company.app.bank.Account.balance.leg,moneyInfo.leg.nullable.error.balance.leg,moneyInfo.leg.nullable.error.leg,moneyInfo.leg.nullable.error.com.company.app.bank.TransactionLegInfo,moneyInfo.leg.nullable.error,com.company.app.bank.MoneyInfo.leg.nullable.com.company.app.bank.Account.balance.leg,com.company.app.bank.MoneyInfo.leg.nullable.balance.leg,com.company.app.bank.MoneyInfo.leg.nullable.leg,com.company.app.bank.MoneyInfo.leg.nullable.com.company.app.bank.TransactionLegInfo,com.company.app.bank.MoneyInfo.leg.nullable,moneyInfo.leg.nullable.com.company.app.bank.Account.balance.le g,moneyInfo.leg.nullab le.balance.leg,moneyInfo.leg.nullable.leg,moneyInfo.leg.nullable.com.company.app.bank.TransactionLegInfo,moneyInfo.leg.nullable,nullable.com.company.app.bank.Account.balance.leg,nullable.balance.leg,nullable.leg,nullable.com.company.app.bank.TransactionLegInfo,nullable]; arguments [leg,class com.company.app.bank.MoneyInfo]; default message [La propiedad [{0}] de la clase [{1}] no puede ser nulo]
    at com.company.app.bank.Account.save(Account.groovy)
    at com.company.app.bank.Account$save$0.call(Unknown Source)
    at ConsoleScript3.run(ConsoleScript3:6)

las constraints en Account:
static constraints = {

        accountRef unique:true, blank:false, nullable:false
        balance (validator:  {return (it.amount > -1)}, nullable:false)  // el saldo no puede ser negativo
    }

Y las constraints en TransactionInfo:
static constraints = {

        legs validator: {return (it.size() >=2)} // La transferencia tiene que tener como mínimo 2 cuentas
    }
En las demás clases no hay constraints (aunque no he eliminado la closure)
No entiendo por qué considera como null el balance y el accountRef cuando le he pasado al constructor el map para inicializarlo ...


No quiero abusar, pero si alguien ve el problema ...

Muchas gracias y saludos
Toni


El 09/08/12 11:00, Alberto Vilches escribió:
Mira a ver si después de crear tu Account el método hasErrors() devuelve true. O haz el save con account.save(failOnError:true)

2012/8/9 Antonio Mas <dquij...@gmail.com>
Hola,

Estoy haciendo ejercicios para mejorar mi kun fu con el desarrallo de grails pero creo que no llego ni a cinturón blanco-amarillo.

Os presento mi problema:
tengo estas relaciones:

Account (relación 1-1 con MoneyInfo, siendo Account la owner)
MoneyInfo (relación 1-1 con Account, 1-1 con TransactionLegInfo, en ambas como owned)
TransactionLegInfo (Relación 1-1 con MoneyInfo siendo TransactionLegInfo owner, y 1-M con transactionInfo)
TransactionInfo (Relación 1-M con TransactionLegInfo)

los atributos en las clases están como:
Account:
     String accountRef
     static hasOne = [balance:MoneyInfo]

MoneyInfo:
    BigDecimal amount
    String currencyRef

    static belongsTo = [accountRef:Account, leg:TransactionLegInfo]

TransactionLegInfo:
    String accountRef

    static hasOne = [amount:MoneyInfo]
    static belongsTo = [transactionInfo:TransactionInfo]

TransactionInfo:
    String transactionRef
    String transactionType
    Date bookingDate
    static hasMany = [legs:TransactionLegInfo]

El problema que tengo es que en los test de integración cuando creo una account y la salvo no muestra ningún mensaje de error pero luego cuando intento hacer un Account.findByAccountRef(ACCOUNT_REF) o un Account.list() no encuentra ningún registro.

He probado en groovyConsole y el problema es que no persiste la información en la base de datos.

groovy> import com.company.area.bank.*
groovy> def money = new MoneyInfo(amount:200.00, currencyRef:'USD')
groovy> def account = new Account(acountRef: 'ACC1', balance:money)
groovy> account.save()
groovy> Account.list()
 
Result: []

¿Alguien me puede arrojar un poco de luz sobre este problema?

Saludos,
Toni

--
Has recibido este mensaje porque estás suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a grailsenc...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a grailsencastell...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.



--
Un saludo.
Alberto Vilches
Twitter: @albertovilches

--
Has recibido este mensaje porque estás suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a grailsenc...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a grailsencastell...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.


--
Has recibido este mensaje porque estás suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a grailsenc...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a grailsencastell...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.

--
Has recibido este mensaje porque estás suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a grailsenc...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a grailsencastell...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.



--
Un saludo.
Alberto Vilches
Twitter: @albertovilches

--
Has recibido este mensaje porque estás suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a grailsenc...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a grailsencastell...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.

--
Has recibido este mensaje porque estás suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a grailsenc...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a grailsencastell...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.

Antonio Mas Rodríguez

unread,
Aug 9, 2012, 2:45:36 PM8/9/12
to grailsenc...@googlegroups.com
Hola de nuevo,

He visto la luz (y he visto que estoy en el huevo todav�a, necesito empollarme m�s)

el problema era como dec�a sensei Alberto, un problema de dependencias circulares entre transactionLegInfo y account con moneyInfo (la culpa de todo siempre la tiene el dinero)

la manera de resolverlo era metiendo en MoneyInfo el belongsTo para especificar el ownership� de transactionLegInfo y account y en los propietarios un unique para especificar que la relaci�n es one-to-one


los atributos en las clases est�n como:
Account:
���� String accountRef
���� MoneyInfo balance
���� static constraints = {
��� ��� ��� balance unique:true
��� }


MoneyInfo:
��� BigDecimal amount
��� String currencyRef
��� static belongsTo = [Account, TransactionLegInfo]


TransactionLegInfo:
��� String accountRef
��� MoneyInfo amount
��� static belongsTo = [transactionInfo:TransactionInfo]
��� static constraints = {
��� ��� ��� amount unique:true
��� }


TransactionInfo:
��� String transactionRef
��� String transactionType
��� Date bookingDate
��� static hasMany = [legs:TransactionLegInfo]
Domo arigat�


El 09/08/12 16:31, Alberto Vilches escribi�:
Si tienes una dependencia circular tiene que hacer al menos un de ellas se pueda crear sin que dependa de ninguna otra, y esa crearla primero.

2012/8/9 Antonio Mas <dquij...@gmail.com>
Hola,

Muchas gracias por los comentarios one more time!!!

No se si es que he montado mal las relaciones entre las clases del modelo, pero tengo muchos problemas (y tampoco tengo muy claro cuando se adjuntan autom�ticamente los objetos en la relaciones)

Pero parece cuando intento salvar un objeto MoneyInfo falla porque no puede insertar null para el id del TransactionLegInfo y el Account, pero cuando intento salvar primero el Account o el TransactionLegInfo intenta crear el MoneyInfo y falla por lo mismo.

Puede ser que haya creado de forma incorrecta las relaciones en el modelo?

Pongo la declaraci�n de los atributos aqu� por si alg�n alma piadosa tiene comentarios, consejos, una p�cima, un hechizo...
...Me est� entrando un sentimiento de "te quiero pero te odio" con grails...
los atributos en las clases est�n como:
Account:
���� String accountRef
���� static hasOne = [balance:MoneyInfo]

MoneyInfo:

��� BigDecimal amount
��� String currencyRef
��� static belongsTo = [accountRef:Account, leg:TransactionLegInfo]

TransactionLegInfo:

��� String accountRef
��� static hasOne = [amount:MoneyInfo]
��� static belongsTo = [transactionInfo:TransactionInfo]

TransactionInfo:

��� String transactionRef
��� String transactionType
��� Date bookingDate
��� static hasMany = [legs:TransactionLegInfo]

Los test en la consola:

groovy> import com.company.app.bank.*
groovy> def tinfo = new TransactionInfo(transactionRef:'tref', transactionType:'ttype', bookingDate: new Date())
groovy> def account = new Account(accountRef: 'ACC1')
groovy> def account2 = new Account(accountRef: 'ACC2')
groovy> def tLeg = new TransactionLegInfo(accountRef: 'ACC1')
groovy> def tLeg2 = new TransactionLegInfo(accountRef: 'ACC2')
groovy> def money = new MoneyInfo(amount:200.00, currencyRef:'USD', accountRef:account, leg:tLeg)
groovy> def money2 = new MoneyInfo(amount:300.00, currencyRef:'USD', accountRef:account2, leg:tLeg2)
groovy> tLeg.amount = money
groovy> account.balance = money
groovy> tLeg2.amount = money2
groovy> account2.balance = money2
groovy> tinfo.legs = [tLeg, tLeg2]�
groovy> account.save(failOnError:true)
groovy> account2.save(failOnError:true)
groovy> tLeg.save(failOnError:true)
groovy> tLeg2.save(failOnError:true)
groovy> money.save(failOnError:true)
groovy> money2.save(failOnError:true)
groovy> tinfo.save(failOnError:true)
groovy> TransactionInfo.list()
�
2012-08-09 15:38:40,508 [Thread-14] ERROR util.JDBCExceptionReporter� - La columna "LEG_ID" no permite valores nulos (NULL)

NULL not allowed for column "LEG_ID"; SQL statement:
insert into money_info (id, version, account_ref_id, amount, currency_ref, leg_id) values (null, ?, ?, ?, ?, ?) [23502-164]
Exception thrown

org.springframework.dao.DataIntegrityViolationException: could not insert: [com.company.app.bank.MoneyInfo]; SQL [insert into money_info (id, version, account_ref_id, amount, currency_ref, leg_id) values (null, ?, ?, ?, ?, ?)]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not insert: [com.company.app.bank.MoneyInfo]
��� at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:641)
��� at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
��� at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)
��� at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:339)
��� at com.company.app.bank.Account.save(Account.groovy)
��� at com.company.app.bank.Account$save.call(Unknown Source)
��� at test-bank.run(test-bank.groovy:22)

Caused by: org.hibernate.exception.ConstraintViolationException: could not insert: [com.company.app.bank.MoneyInfo]
��� ... 4 more

Caused by: org.h2.jdbc.JdbcSQLException: La columna "LEG_ID" no permite valores nulos (NULL)
NULL not allowed for column "LEG_ID"; SQL statement:
insert into money_info (id, version, account_ref_id, amount, currency_ref, leg_id) values (null, ?, ?, ?, ?, ?) [23502-164]
��� at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
��� at org.h2.message.DbException.get(DbException.java:169)
��� at org.h2.message.DbException.get(DbException.java:146)
��� at org.h2.table.Column.validateConvertUpdateSequence(Column.java:293)
��� at org.h2.table.Table.validateConvertUpdateSequence(Table.java:680)
��� at org.h2.command.dml.Insert.insertRows(Insert.java:120)
��� at org.h2.command.dml.Insert.update(Insert.java:84)
��� at org.h2.command.CommandContainer.update(CommandContainer.java:73)
��� at org.h2.command.Command.executeUpdate(Command.java:226)
��� at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:143)
��� at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:129)
��� at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
��� at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
��� at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:93)
��� at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:56)
��� ... 32 more

El 09/08/12 12:41, Alberto Vilches escribi�:
SI, ademas falta el leg en MoneyInfo

def money = new MoneyInfo(amount:200.00, currencyRef:'USD', leg:new MoneyInfo(....).save())�

2012/8/9 Jorge Jim�nez <sem...@gmail.com>
Antonio, veo que la clase tiene una propiedad accountRef, pero en consola has puesto:
def account = new Account(acountRef: 'ACC1', balance:money)�
Puede que te falte una 'c' en el nombre de la propiedad� accountRef.

Vamos, lo digo por el error, que te indica que es nulo y salta la constraint.

Un saludo,

Jorge Jim�nez

On Aug 9, 2012, at 11:55 AM, Antonio Mas <dquij...@gmail.com> wrote:

Muchas gracias Alberto por el apunte,

Ahora por lo menos se que est� fallando... aunque no entiendo muy bien por qu�.

Este es el mensaje de error:
Exception thrown

grails.validation.ValidationException: Validation Error(s) occurred during save():
- Field error in object 'com.company.app.bank.Account' on field 'accountRef': rejected value [null]; codes [com.company.app.bank.Account.accountRef.nullable.error.com.company.app.bank.Account.accountRef,com.company.app.bank.Account.accountRef.nullable.error.accountRef,com.company.app.bank.Account.accountRef.nullable.error.java.lang.String,com.company.app.bank.Account.accountRef.nullable.error,account.accountRef.nullable.error.com.company.app.bank.Account.accountRef,account.accountRef.nullable.error.accountRef,account.accountRef.nullable.error.java.lang.String,account.accountRef.nullable.error,com.company.app.bank.Account.accountRef.nullable.com.company.app.bank.Account.accountRef,com.company.app.bank.Account.accountRef.nullable.accountRef,com.company.app.bank.Account.accountRef.nullable.java.lang.String,com.company.app.bank.Account.accountRef.nullable,account.accountRef.nullable.com.company.app.bank.Account.accountRef,account.accountRef.nullable.accountRef,account.accountRef.nullable.java.lang.String,account.accountRef.nullable,nullable.com.company.app.bank.Ac count.accountRef,nulla ble.accountRef,nullable.java.lang.String,nullable]; arguments [accountRef,class com.company.app.bank.Account]; default message [La propiedad [{0}] de la clase [{1}] no puede ser nulo]
- Field error in object 'com.company.app.bank.Account' on field 'balance.leg': rejected value [null]; codes [com.company.app.bank.MoneyInfo.leg.nullable.error.com.company.app.bank.Account.balance.leg,com.company.app.bank.MoneyInfo.leg.nullable.error.balance.leg,com.company.app.bank.MoneyInfo.leg.nullable.error.leg,com.company.app.bank.MoneyInfo.leg.nullable.error.com.company.app.bank.TransactionLegInfo,com.company.app.bank.MoneyInfo.leg.nullable.error,moneyInfo.leg.nullable.error.com.company.app.bank.Account.balance.leg,moneyInfo.leg.nullable.error.balance.leg,moneyInfo.leg.nullable.error.leg,moneyInfo.leg.nullable.error.com.company.app.bank.TransactionLegInfo,moneyInfo.leg.nullable.error,com.company.app.bank.MoneyInfo.leg.nullable.com.company.app.bank.Account.balance.leg,com.company.app.bank.MoneyInfo.leg.nullable.balance.leg,com.company.app.bank.MoneyInfo.leg.nullable.leg,com.company.app.bank.MoneyInfo.leg.nullable.com.company.app.bank.TransactionLegInfo,com.company.app.bank.MoneyInfo.leg.nullable,moneyInfo.leg.nullable.com.company.app.bank.Account.ba lance.le g,moneyInfo.leg.nullab le.balance.leg,moneyInfo.leg.nullable.leg,moneyInfo.leg.nullable.com.company.app.bank.TransactionLegInfo,moneyInfo.leg.nullable,nullable.com.company.app.bank.Account.balance.leg,nullable.balance.leg,nullable.leg,nullable.com.company.app.bank.TransactionLegInfo,nullable]; arguments [leg,class com.company.app.bank.MoneyInfo]; default message [La propiedad [{0}] de la clase [{1}] no puede ser nulo]


��� at com.company.app.bank.Account.save(Account.groovy)
��� at com.company.app.bank.Account$save$0.call(Unknown Source)
��� at ConsoleScript3.run(ConsoleScript3:6)

las constraints en Account:
static constraints = {

������� accountRef unique:true, blank:false, nullable:false
������� balance (validator:� {return (it.amount > -1)}, nullable:false)� // el saldo no puede ser negativo
��� }

Y las constraints en TransactionInfo:
static constraints = {

������� legs validator: {return (it.size() >=2)} // La transferencia tiene que tener como m�nimo 2 cuentas
��� }
En las dem�s clases no hay constraints (aunque no he eliminado la closure)
No entiendo por qu� considera como null el balance y el accountRef cuando le he pasado al constructor el map para inicializarlo ...


No quiero abusar, pero si alguien ve el problema ...

Muchas gracias y saludos
Toni


El 09/08/12 11:00, Alberto Vilches escribi�:
Mira a ver si despu�s de crear tu Account el m�todo hasErrors() devuelve true. O haz el save con account.save(failOnError:true)

2012/8/9 Antonio Mas <dquij...@gmail.com>
Hola,

Estoy haciendo ejercicios para mejorar mi kun fu con el desarrallo de grails pero creo que no llego ni a cintur�n blanco-amarillo.

Os presento mi problema:
tengo estas relaciones:

Account (relaci�n 1-1 con MoneyInfo, siendo Account la owner)
MoneyInfo (relaci�n 1-1 con Account, 1-1 con TransactionLegInfo, en ambas como owned)
TransactionLegInfo (Relaci�n 1-1 con MoneyInfo siendo TransactionLegInfo owner, y 1-M con transactionInfo)
TransactionInfo (Relaci�n 1-M con TransactionLegInfo)

los atributos en las clases est�n como:
Account:
���� String accountRef
���� static hasOne = [balance:MoneyInfo]

MoneyInfo:

��� BigDecimal amount
��� String currencyRef
��� static belongsTo = [accountRef:Account, leg:TransactionLegInfo]

TransactionLegInfo:

��� String accountRef
��� static hasOne = [amount:MoneyInfo]
��� static belongsTo = [transactionInfo:TransactionInfo]

TransactionInfo:

��� String transactionRef
��� String transactionType
��� Date bookingDate
��� static hasMany = [legs:TransactionLegInfo]

El problema que tengo es que en los test de integraci�n cuando creo una account y la salvo no muestra ning�n mensaje de error pero luego cuando intento hacer un Account.findByAccountRef(ACCOUNT_REF) o un Account.list() no encuentra ning�n registro.

He probado en groovyConsole y el problema es que no persiste la informaci�n en la base de datos.

groovy> import com.company.area.bank.*
groovy> def money = new MoneyInfo(amount:200.00, currencyRef:'USD')
groovy> def account = new Account(acountRef: 'ACC1', balance:money)
groovy> account.save()
groovy> Account.list()
�
Result: []

�Alguien me puede arrojar un poco de luz sobre este problema?

Saludos,
Toni

--
Has recibido este mensaje porque est�s suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, env�a un correo electr�nico a grailsenc...@googlegroups.com.
Para anular tu suscripci�n a este grupo, env�a un correo electr�nico a grailsencastell...@googlegroups.com
Para tener acceso a m�s opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.



--
Un saludo.
Alberto Vilches
Twitter: @albertovilches

--
Has recibido este mensaje porque est�s suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, env�a un correo electr�nico a grailsenc...@googlegroups.com.
Para anular tu suscripci�n a este grupo, env�a un correo electr�nico a grailsencastell...@googlegroups.com
Para tener acceso a m�s opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.


--
Has recibido este mensaje porque est�s suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, env�a un correo electr�nico a grailsenc...@googlegroups.com.
Para anular tu suscripci�n a este grupo, env�a un correo electr�nico a grailsencastell...@googlegroups.com
Para tener acceso a m�s opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.

--
Has recibido este mensaje porque est�s suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, env�a un correo electr�nico a grailsenc...@googlegroups.com.
Para anular tu suscripci�n a este grupo, env�a un correo electr�nico a grailsencastell...@googlegroups.com
Para tener acceso a m�s opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.



--
Un saludo.
Alberto Vilches
Twitter: @albertovilches

--
Has recibido este mensaje porque est�s suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, env�a un correo electr�nico a grailsenc...@googlegroups.com.
Para anular tu suscripci�n a este grupo, env�a un correo electr�nico a grailsencastell...@googlegroups.com
Para tener acceso a m�s opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.

--
Has recibido este mensaje porque est�s suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, env�a un correo electr�nico a grailsenc...@googlegroups.com.
Para anular tu suscripci�n a este grupo, env�a un correo electr�nico a grailsencastell...@googlegroups.com
Para tener acceso a m�s opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.



--
Un saludo.
Alberto Vilches
Twitter: @albertovilches

--
Has recibido este mensaje porque est�s suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, env�a un correo electr�nico a grailsenc...@googlegroups.com.
Para anular tu suscripci�n a este grupo, env�a un correo electr�nico a grailsencastell...@googlegroups.com
Para tener acceso a m�s opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.

Alberto Vilches

unread,
Aug 9, 2012, 3:07:13 PM8/9/12
to grailsenc...@googlegroups.com
Me alegro :)

El 09/08/2012, a las 20:45, "Antonio Mas Rodríguez" <dquij...@gmail.com> escribió:

Hola de nuevo,

He visto la luz (y he visto que estoy en el huevo todavía, necesito empollarme más)

el problema era como decía sensei Alberto, un problema de dependencias circulares entre transactionLegInfo y account con moneyInfo (la culpa de todo siempre la tiene el dinero)

la manera de resolverlo era metiendo en MoneyInfo el belongsTo para especificar el ownership  de transactionLegInfo y account y en los propietarios un unique para especificar que la relación es one-to-one


los atributos en las clases están como:
Account:
     String accountRef
     MoneyInfo balance
     static constraints = {
            balance unique:true

    }

MoneyInfo:
    BigDecimal amount
    String currencyRef
    static belongsTo = [Account, TransactionLegInfo]

TransactionLegInfo:
    String accountRef
    MoneyInfo amount

    static belongsTo = [transactionInfo:TransactionInfo]
    static constraints = {
            amount unique:true

    }

TransactionInfo:
    String transactionRef
    String transactionType
    Date bookingDate
    static hasMany = [legs:TransactionLegInfo]
Domo arigató


El 09/08/12 16:31, Alberto Vilches escribió:
Si tienes una dependencia circular tiene que hacer al menos un de ellas se pueda crear sin que dependa de ninguna otra, y esa crearla primero.

2012/8/9 Antonio Mas <dquij...@gmail.com>
Hola,

Muchas gracias por los comentarios one more time!!!

No se si es que he montado mal las relaciones entre las clases del modelo, pero tengo muchos problemas (y tampoco tengo muy claro cuando se adjuntan automáticamente los objetos en la relaciones)

Pero parece cuando intento salvar un objeto MoneyInfo falla porque no puede insertar null para el id del TransactionLegInfo y el Account, pero cuando intento salvar primero el Account o el TransactionLegInfo intenta crear el MoneyInfo y falla por lo mismo.

Puede ser que haya creado de forma incorrecta las relaciones en el modelo?

Pongo la declaración de los atributos aquí por si algún alma piadosa tiene comentarios, consejos, una pócima, un hechizo...
...Me está entrando un sentimiento de "te quiero pero te odio" con grails...
los atributos en las clases están como:
Account:
     String accountRef
     static hasOne = [balance:MoneyInfo]

MoneyInfo:
    BigDecimal amount
    String currencyRef

    static belongsTo = [accountRef:Account, leg:TransactionLegInfo]

TransactionLegInfo:
    String accountRef

    static hasOne = [amount:MoneyInfo]
    static belongsTo = [transactionInfo:TransactionInfo]

TransactionInfo:
    String transactionRef
    String transactionType
    Date bookingDate
    static hasMany = [legs:TransactionLegInfo]
Los test en la consola:

groovy> import com.company.app.bank.*
groovy> def tinfo = new TransactionInfo(transactionRef:'tref', transactionType:'ttype', bookingDate: new Date())
groovy> def account = new Account(accountRef: 'ACC1')
groovy> def account2 = new Account(accountRef: 'ACC2')
groovy> def tLeg = new TransactionLegInfo(accountRef: 'ACC1')
groovy> def tLeg2 = new TransactionLegInfo(accountRef: 'ACC2')
groovy> def money = new MoneyInfo(amount:200.00, currencyRef:'USD', accountRef:account, leg:tLeg)
groovy> def money2 = new MoneyInfo(amount:300.00, currencyRef:'USD', accountRef:account2, leg:tLeg2)
groovy> tLeg.amount = money
groovy> account.balance = money
groovy> tLeg2.amount = money2
groovy> account2.balance = money2
groovy> tinfo.legs = [tLeg, tLeg2] 
groovy> account.save(failOnError:true)
groovy> account2.save(failOnError:true)
groovy> tLeg.save(failOnError:true)
groovy> tLeg2.save(failOnError:true)
groovy> money.save(failOnError:true)
groovy> money2.save(failOnError:true)
groovy> tinfo.save(failOnError:true)
groovy> TransactionInfo.list()
 
2012-08-09 15:38:40,508 [Thread-14] ERROR util.JDBCExceptionReporter  - La columna "LEG_ID" no permite valores nulos (NULL)

NULL not allowed for column "LEG_ID"; SQL statement:
insert into money_info (id, version, account_ref_id, amount, currency_ref, leg_id) values (null, ?, ?, ?, ?, ?) [23502-164]
Exception thrown

org.springframework.dao.DataIntegrityViolationException: could not insert: [com.company.app.bank.MoneyInfo]; SQL [insert into money_info (id, version, account_ref_id, amount, currency_ref, leg_id) values (null, ?, ?, ?, ?, ?)]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not insert: [com.company.app.bank.MoneyInfo]
    at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:641)
    at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)
    at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:339)
    at com.company.app.bank.Account.save(Account.groovy)
    at com.company.app.bank.Account$save.call(Unknown Source)
    at test-bank.run(test-bank.groovy:22)
Caused by: org.hibernate.exception.ConstraintViolationException: could not insert: [com.company.app.bank.MoneyInfo]
    ... 4 more
Caused by: org.h2.jdbc.JdbcSQLException: La columna "LEG_ID" no permite valores nulos (NULL)
NULL not allowed for column "LEG_ID"; SQL statement:
insert into money_info (id, version, account_ref_id, amount, currency_ref, leg_id) values (null, ?, ?, ?, ?, ?) [23502-164]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
    at org.h2.message.DbException.get(DbException.java:169)
    at org.h2.message.DbException.get(DbException.java:146)
    at org.h2.table.Column.validateConvertUpdateSequence(Column.java:293)
    at org.h2.table.Table.validateConvertUpdateSequence(Table.java:680)
    at org.h2.command.dml.Insert.insertRows(Insert.java:120)
    at org.h2.command.dml.Insert.update(Insert.java:84)
    at org.h2.command.CommandContainer.update(CommandContainer.java:73)
    at org.h2.command.Command.executeUpdate(Command.java:226)
    at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:143)
    at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:129)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
    at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:93)
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:56)
    ... 32 more

El 09/08/12 12:41, Alberto Vilches escribió:
SI, ademas falta el leg en MoneyInfo

def money = new MoneyInfo(amount:200.00, currencyRef:'USD', leg:new MoneyInfo(....).save()) 

2012/8/9 Jorge Jiménez <sem...@gmail.com>
Antonio, veo que la clase tiene una propiedad accountRef, pero en consola has puesto:
def account = new Account(acountRef: 'ACC1', balance:money) 
Puede que te falte una 'c' en el nombre de la propiedad… accountRef.

Vamos, lo digo por el error, que te indica que es nulo y salta la constraint.

Un saludo,

Jorge Jiménez

On Aug 9, 2012, at 11:55 AM, Antonio Mas <dquij...@gmail.com> wrote:

Muchas gracias Alberto por el apunte,

Ahora por lo menos se que está fallando... aunque no entiendo muy bien por qué.

Este es el mensaje de error:
Exception thrown

grails.validation.ValidationException: Validation Error(s) occurred during save():
- Field error in object 'com.company.app.bank.Account' on field 'accountRef': rejected value [null]; codes [com.company.app.bank.Account.accountRef.nullable.error.com.company.app.bank.Account.accountRef,com.company.app.bank.Account.accountRef.nullable.error.accountRef,com.company.app.bank.Account.accountRef.nullable.error.java.lang.String,com.company.app.bank.Account.accountRef.nullable.error,account.accountRef.nullable.error.com.company.app.bank.Account.accountRef,account.accountRef.nullable.error.accountRef,account.accountRef.nullable.error.java.lang.String,account.accountRef.nullable.error,com.company.app.bank.Account.accountRef.nullable.com.company.app.bank.Account.accountRef,com.company.app.bank.Account.accountRef.nullable.accountRef,com.company.app.bank.Account.accountRef.nullable.java.lang.String,com.company.app.bank.Account.accountRef.nullable,account.accountRef.nullable.com.company.app.bank.Account.accountRef,account.accountRef.nullable.accountRef,account.accountRef.nullable.java.lang.String,account.accountRef.nullable,nullable.com.company.app.bank.Ac count.accountRef,nulla ble.accountRef,nullable.java.lang.String,nullable]; arguments [accountRef,class com.company.app.bank.Account]; default message [La propiedad [{0}] de la clase [{1}] no puede ser nulo]
- Field error in object 'com.company.app.bank.Account' on field 'balance.leg': rejected value [null]; codes [com.company.app.bank.MoneyInfo.leg.nullable.error.com.company.app.bank.Account.balance.leg,com.company.app.bank.MoneyInfo.leg.nullable.error.balance.leg,com.company.app.bank.MoneyInfo.leg.nullable.error.leg,com.company.app.bank.MoneyInfo.leg.nullable.error.com.company.app.bank.TransactionLegInfo,com.company.app.bank.MoneyInfo.leg.nullable.error,moneyInfo.leg.nullable.error.com.company.app.bank.Account.balance.leg,moneyInfo.leg.nullable.error.balance.leg,moneyInfo.leg.nullable.error.leg,moneyInfo.leg.nullable.error.com.company.app.bank.TransactionLegInfo,moneyInfo.leg.nullable.error,com.company.app.bank.MoneyInfo.leg.nullable.com.company.app.bank.Account.balance.leg,com.company.app.bank.MoneyInfo.leg.nullable.balance.leg,com.company.app.bank.MoneyInfo.leg.nullable.leg,com.company.app.bank.MoneyInfo.leg.nullable.com.company.app.bank.TransactionLegInfo,com.company.app.bank.MoneyInfo.leg.nullable,moneyInfo.leg.nullable.com.company.app.bank.Account.ba lance.le g,moneyInfo.leg.nullab le.balance.leg,moneyInfo.leg.nullable.leg,moneyInfo.leg.nullable.com.company.app.bank.TransactionLegInfo,moneyInfo.leg.nullable,nullable.com.company.app.bank.Account.balance.leg,nullable.balance.leg,nullable.leg,nullable.com.company.app.bank.TransactionLegInfo,nullable]; arguments [leg,class com.company.app.bank.MoneyInfo]; default message [La propiedad [{0}] de la clase [{1}] no puede ser nulo]
    at com.company.app.bank.Account.save(Account.groovy)
    at com.company.app.bank.Account$save$0.call(Unknown Source)
    at ConsoleScript3.run(ConsoleScript3:6)

las constraints en Account:
static constraints = {

        accountRef unique:true, blank:false, nullable:false
        balance (validator:  {return (it.amount > -1)}, nullable:false)  // el saldo no puede ser negativo
    }

Y las constraints en TransactionInfo:
static constraints = {

        legs validator: {return (it.size() >=2)} // La transferencia tiene que tener como mínimo 2 cuentas
    }
En las demás clases no hay constraints (aunque no he eliminado la closure)
No entiendo por qué considera como null el balance y el accountRef cuando le he pasado al constructor el map para inicializarlo ...


No quiero abusar, pero si alguien ve el problema ...

Muchas gracias y saludos
Toni


El 09/08/12 11:00, Alberto Vilches escribió:
Mira a ver si después de crear tu Account el método hasErrors() devuelve true. O haz el save con account.save(failOnError:true)

2012/8/9 Antonio Mas <dquij...@gmail.com>
Hola,

Estoy haciendo ejercicios para mejorar mi kun fu con el desarrallo de grails pero creo que no llego ni a cinturón blanco-amarillo.

Os presento mi problema:
tengo estas relaciones:

Account (relación 1-1 con MoneyInfo, siendo Account la owner)
MoneyInfo (relación 1-1 con Account, 1-1 con TransactionLegInfo, en ambas como owned)
TransactionLegInfo (Relación 1-1 con MoneyInfo siendo TransactionLegInfo owner, y 1-M con transactionInfo)
TransactionInfo (Relación 1-M con TransactionLegInfo)

los atributos en las clases están como:
Account:
     String accountRef
     static hasOne = [balance:MoneyInfo]

MoneyInfo:
    BigDecimal amount
    String currencyRef

    static belongsTo = [accountRef:Account, leg:TransactionLegInfo]

TransactionLegInfo:
    String accountRef

    static hasOne = [amount:MoneyInfo]
    static belongsTo = [transactionInfo:TransactionInfo]

TransactionInfo:
    String transactionRef
    String transactionType
    Date bookingDate
    static hasMany = [legs:TransactionLegInfo]

El problema que tengo es que en los test de integración cuando creo una account y la salvo no muestra ningún mensaje de error pero luego cuando intento hacer un Account.findByAccountRef(ACCOUNT_REF) o un Account.list() no encuentra ningún registro.

He probado en groovyConsole y el problema es que no persiste la información en la base de datos.

groovy> import com.company.area.bank.*
groovy> def money = new MoneyInfo(amount:200.00, currencyRef:'USD')
groovy> def account = new Account(acountRef: 'ACC1', balance:money)
groovy> account.save()
groovy> Account.list()
 
Result: []

¿Alguien me puede arrojar un poco de luz sobre este problema?

Saludos,
Toni

--
Has recibido este mensaje porque estás suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a grailsenc...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a grailsencastell...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.



--
Un saludo.
Alberto Vilches
Twitter: @albertovilches

--
Has recibido este mensaje porque estás suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a grailsenc...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a grailsencastell...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.


--
Has recibido este mensaje porque estás suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a grailsenc...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a grailsencastell...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.

--
Has recibido este mensaje porque estás suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a grailsenc...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a grailsencastell...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.



--
Un saludo.
Alberto Vilches
Twitter: @albertovilches

--
Has recibido este mensaje porque estás suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a grailsenc...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a grailsencastell...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.

--
Has recibido este mensaje porque estás suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a grailsenc...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a grailsencastell...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.



--
Un saludo.
Alberto Vilches
Twitter: @albertovilches

--
Has recibido este mensaje porque estás suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a grailsenc...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a grailsencastell...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.

--
Has recibido este mensaje porque estás suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a grailsenc...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a grailsencastell...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.
Reply all
Reply to author
Forward
0 new messages