метод сохранения gorm, вызывающий срабатывание запроса select - PullRequest
2 голосов
/ 13 мая 2011

Я использую grails 1.3.7 и zkoss, и моя модель предметной области такая, как показано ниже, я загружаю сущность Person в сеансе 1 и вносю в нее изменения через пользовательский интерфейс.

При нажатии сохранения в сеансе2 Я хочу сохранить сущность.

Итак, из моего композитора / контроллера я вызываю метод службы (транзакционный), а затем выполняю person.save (). Когда я вижу, что sql-запросы запускаются, я вижу запрос, которыйпытается извлечь объект сотрудника.

После чего запускается сохранение и выдается исключение nonuniqueobjectexception

org.hibernate.NonUniqueObjectException: другой объект с тем же значением идентификаторауже был связан с сеансом: [com.nthdimenzion.domain.Employee # 2]

Запрос

Hibernate: select this_.id as id7_0_, this_.version as version7_0_, this_.emp_id as emp4_7_0_, this_.person_id as person5_7_0_ from person_role this_ where this_.class='com.nthdimenzion.domain.Employee' and this_.emp_id=?

class PersonService {
static transactional = true
def savePerson(Person person) {
    person = person.save();
}

}

class Person extends Party{

String firstName;
String middleName;  
static hasMany = [ personRoles : PersonRole ] -- lazy loaded

....}

class PersonRole {
public static enum ROLETYPES{
    EMPLOYEE,AUTHOR
};
public boolean hasRoleType (ROLETYPES roleType){
    return false;
}
static transients = ['ROLETYPES']
static constraints = {
}
 }



class Employee extends PersonRole{
def empRoleType = [ROLETYPES.EMPLOYEE]
String empId
    static belongsTo = [person:Person]
 static transients = ['empRoleType', 'uid']
static constraints = {
    books(nullable:true)
    empId(unique:true)
}
static hasMany = [books:Book]
static mapping = { books cascade:"all" }
static belongsTo = [person:Person]
  ......
}

Правильно ли это поведение?

1 Ответ

1 голос
/ 13 мая 2011

Вы должны указать в Employee отображение, что empId является первичным ключом - это, вероятно, единственная причина для NonUniqueObjectException.

Запрос SQL должен исходить из уникального ограничения на empIdfield.

Почему бы не использовать неявный Grails / Hibernate id, используете ли вы устаревшую базу данных с определенным отображением?

edit Не понимаю, почемубудет ли уникальное ограничение причиной NonUniqueObjectException - не могли бы вы попробовать его без ограничения?

Если проблема остается, вы, должно быть, дважды сохранили объект из одного сеанса - понятия не имеете, как это может произойти, может быть, merge() -ing Employee из предыдущего сеанса.

Запрос SQL вызван ограничением уникальности, и это правильно.

...