вставляет в базу данных, сбой службы Grails - PullRequest
0 голосов
/ 12 января 2012

Я использую oracle11g в качестве базы данных и пытаюсь сделать вставки в таблицу globalusers из моего класса обслуживания grails.Я получаю источник данных в сервисе grails следующим образом:

import org.codehaus.groovy.grails.commons.ApplicationHolder as AH 
class UserImportService {
 def dataSource = AH.application.mainContext.dataSource
 def sql = new Sql(dataSource) ;
 String insertQuery="insert into GLOBALUSERS (..) values (..)
                try{
                    sql.execute(insertQuery)
                }
                catch(Exception e){

                    println "Failed to insert : " +insertQuery
                    println "Exception is:" + e;

                }
}

Когда я запускаю службу из внешнего интерфейса, я получаю исключение sql, говорящее

Exception is:java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot insert NULL into ("GRA"."GLOBALUSERS"."ID")

, так как я использую источник данных с моимпользовательский диалект, который обрабатывает генерацию идентификаторов и автоинкремент, это должно обрабатываться grail / hibernate.

При использовании одного и того же источника данных из другого пользовательского интерфейса .. один за другим .. он работает .. так что диалект работает нормально.но этот сервис для пакетных обновлений не работает.

Ответы [ 2 ]

2 голосов
/ 12 января 2012

Я не знаю Грааля, но мне кажется, что

  • ваш код вообще не использует Hibernate. Он выполняет SQL напрямую
  • , даже если он использовал Hibernate, использование SQL-запросов в Hibernate полностью игнорирует генерацию идентификаторов. Для автоматической генерации идентификатора вам необходимо создать экземпляр и сохранить сущность.
1 голос
/ 12 января 2012

Выполнение direct Sql для bean-компонента dataSource обойдёт метод генерации идентификатора Hibernate, который, как я понимаю, выполняет nextval() в соответствующей последовательности Oracle.Итак, ваши варианты:

  • Используйте Grails / GORM, где вы создаете объект, заполняете и .save()
  • Запрашиваете последовательность самостоятельно, что потребует выполнения nextval()на последовательности, но это сделает ваш Sql Oracle-специфичный
  • Добавить триггер Oracle в базу данных, которая проверяет, установлен ли первичный ключ, и если он не делает запрос последовательности nextval() идобавляет его в новую строку базы данных.Это обеспечит совместимость вашего прямого Sql с автоинкрементами MySql и последовательностями Oracle.
...