【问题标题】:Domain validates but won't save域验证但不会保存
【发布时间】:2012-03-24 13:10:21
【问题描述】:

我有以下设置。

类,例如具有 CarPart (belongsTo=[car:Car]) 的 Car。

当我创建汽车时,我还想创建一些默认的 CarParts,所以我这样做了

def car = new Car(bla bla bla)
def part = new CarPart(car:car)

现在,当我执行 car.validate() 或 part.validate() 时,它似乎很好。 但是当我这样做时 if(car.save && part.save() 我得到了这个异常:

    2012-03-24 14:02:21,943 [http-8080-4] ERROR util.JDBCExceptionReporter  - Batch entry 0 insert into car_part (version, car_id, id) values ('0', '297', '298') was aborted.  Call getNextException to see the cause.
2012-03-24 14:02:21,943 [http-8080-4] ERROR util.JDBCExceptionReporter  - ERROR: value too long for type character varying(6)
2012-03-24 14:02:21,943 [http-8080-4] ERROR events.PatchedDefaultFlushEventListener  - Could not synchronize database state with session
org.hibernate.exception.DataException: Could not execute JDBC batch update

Stacktrace follows:
java.sql.BatchUpdateException: Batch entry 0 insert into car_part (version, deal_id, id) values ('0', '297', '298') was aborted.  Call getNextException to see the cause.
    at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2621)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1837)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:407)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2754)
    at $Proxy20.flush(Unknown Source)
    at ristretto.DealController$_closure5.doCall(DealController.groovy:109)
    at ristretto.DealController$_closure5.doCall(DealController.groovy)
    at java.lang.Thread.run(Thread.java:722)

有什么想法吗?

【问题讨论】:

    标签: postgresql grails grails-orm grails-domain-class


    【解决方案1】:

    调用 validate 实际上只会检查约束。保存失败的是对数据库的实际持久性(验证无法真正检查)。

    一般来说,在 Grails 中,您会希望通过以下两种方式中的一种来执行此操作:

    def car = new Car(bla bla)
    car.save()
    def carPart = new CarPart(car:car)
    carPart.save()
    

    def car = new Car(bla bla)
    def carPart = new CarPart(bla bla)
    car.addToCarParts(carPart)
    car.save()
    

    【讨论】:

    • 很好的答案,但是我真的想用某种类型的交易来做这件事,如果由于某种原因 CarPart 不保存也不应该 Car...
    • 所以把它放在一个服务中,事务就会被处理。如果是这种情况,我的第二个例子会更好。如果 CarPart 失败,错误将持续到 Car 并且事务将回滚。
    • 我现在尝试在服务中执行此操作,我得到我的汽车(已经创建)并执行 CarPart p = new CarPart(bla bla bla).save(),它给了我:java.sql .BatchUpdateException:批处理条目 0 插入到 car_part(版本、已创建、car_id、状态、id)值('0'、'2012-03-26 23:11:01.512000 +02:00:00'、'303'、' SHAFT', '368') 被中止。调用 getNextException 来查看原因。在 org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2621)
    • 好吧,最后我需要做一个 carPart.refresh()!
    猜你喜欢
    • 1970-01-01
    • 2016-10-06
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多