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 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.
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
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.
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.
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]
groovy> import com.company.area.bank.*¿Alguien me puede arrojar un poco de luz sobre este problema?
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: []
--
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.
Exception thrownlas constraints en Account:
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)
static constraints = {Y las constraints en TransactionInfo:
accountRef unique:true, blank:false, nullable:false
balance (validator: {return (it.amount > -1)}, nullable:false) // el saldo no puede ser negativo
}
static constraints = {En las demás clases no hay constraints (aunque no he eliminado la closure)
legs validator: {return (it.size() >=2)} // La transferencia tiene que tener como mínimo 2 cuentas
}
Laura
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: []
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]
def account = new Account(acountRef: 'ACC1', balance:money)
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]
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
SI, ademas falta el leg en MoneyInfo
def money = new MoneyInfo(amount:200.00, currencyRef:'USD', leg:new MoneyInfo(....).save())�
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]las constraints en Account:
- 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)
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 = {En las dem�s clases no hay constraints (aunque no he eliminado la closure)
������� legs validator: {return (it.size() >=2)} // La transferencia tiene que tener como m�nimo 2 cuentas
��� }
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()
--��Alguien me puede arrojar un poco de luz sobre este problema?
Result: []
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 VilchesTwitter: @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.
--
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.
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())
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- 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]
grails.validation.ValidationException: Validation Error(s) occurred during save():
- 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 VilchesTwitter: @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.
--
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.
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�
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.
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())�
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- 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]
grails.validation.ValidationException: Validation Error(s) occurred during save():
- 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()
--��Alguien me puede arrojar un poco de luz sobre este problema?
Result: []
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 VilchesTwitter: @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.
--
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 VilchesTwitter: @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.
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.
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())
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- 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]
grails.validation.ValidationException: Validation Error(s) occurred during save():
- 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 VilchesTwitter: @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.
--
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 VilchesTwitter: @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.