2012-03-24 4 views
1

У меня есть следующая настройка.Домен проверяет, но не сохраняет

Класс, скажем, Автомобиль, имеющий CarPart (принадлежитTo = [автомобиль: Автомобиль]).

Когда я создаю автомобиль, я также хочу, чтобы создать сома по умолчанию CarParts, так что я

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

Теперь, когда я car.validate() или part.validate(), кажется, хорошо. Но когда я делаю, если (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

Calling Validate действительно только собирается проверить ограничения Что происходит сбой в ваша экономия является фактической настойчивостью в базу данных (Validate не может проверить, что)

Как правило, в Grails, вы хотели бы сделать это 1 из 2 способов:.

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() 
+0

Хороший ответ, но то, что я действительно хочу сделать это с некоторым типом сделки, если по какой-то причине не CarPart не спасает ни если автомобиль ... – marko

+0

Так положить его в обслуживание и транзакция будут обработаны. В этом случае мой второй пример будет лучше. Если 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