2012-03-24 6 views
1

次の設定があります。ドメインは検証しますが保存しません

クラス、たとえば、CarPart(belongsTo = [car:Car])を持つクラス。

私はまた、SOMのデフォルトCarPartsを作成したい車を作成していますので、私は、私はcar.validate()またはpart.validateを行うとき()、それは罰金だ、今

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

を行います。 しかしとき(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) 

任意のアイデア

答えて

2

呼び出しの検証は本当に唯一の制約をチェックするために起こっているに失敗していますか?。あなたの保存が(検証が本当にいることを確認することはできません)データベースへの実際の持続性である

一般的に、Grailsの中で、あなたはこの1〜2の方法したいと思う:。

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

または

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

良い答えが、私は実際にいくつかの理由でCarPartは保存しません。どちらの車が... – marko

+0

だからでそれを置く必要がある場合、トランザクションのいくつかの種類でこれをやりたいですサービスが処理され、トランザクションが処理されます。その場合、私の2番目の例はより良いものになるでしょう。 CarPartが失敗すると、エラーはCarまで保持され、トランザクションはロールバックされます。 – Gregg

+0

CarPart p = new CarPart(bla bla bla).save()、それは私に提供されます:java.sql.BatchUpdateException:バッチエントリ0の挿入car_part(version、created、car_id、status、id)の値( '0'、 '2012-03-26 23:11:01.512000 +02:00:00'、 '303'、 'SHAFT'、 '368')中止されました。原因を調べるにはgetNextExceptionを呼び出します。 \t at org.postgresql.jdbc2.AbstractJdbc2Statement $ BatchResultHandler.handleError(AbstractJdbc2Statement.java:2621) – marko

関連する問題