Hibernate gorm save方法导致触发select查询

Hibernate gorm save方法导致触发select查询,hibernate,grails,gorm,Hibernate,Grails,Gorm,我正在使用Grails1.3.7和zkoss,我的域模型如下,我在会话1中加载Person实体,并通过UI对其进行更改 在会话2中按save键时,我想保存实体 因此,我从composer/controller调用一个service methodtransactional,然后执行person.save,当我看到触发sql查询时,我看到一个试图检索employee对象的查询 然后启动save并抛出一个ununiqueObjectException 例外情况 org.hibernate.unUniq

我正在使用Grails1.3.7和zkoss,我的域模型如下,我在会话1中加载Person实体,并通过UI对其进行更改

在会话2中按save键时,我想保存实体

因此,我从composer/controller调用一个service methodtransactional,然后执行person.save,当我看到触发sql查询时,我看到一个试图检索employee对象的查询

然后启动save并抛出一个ununiqueObjectException 例外情况

org.hibernate.unUniqueObjectException:具有相同标识符值的不同对象已与会话关联:[com.nthdimenzion.domain.Employee2]

质疑

}

。。。。 }


此行为正确吗?

您必须在Employee mapping中指定empId是主键-这可能是UnuniqueObjectException的唯一原因

SQL查询必须来自empId字段上的唯一约束

为什么不使用Grails'/Hibernate隐式id呢?您使用的是具有特定映射的遗留数据库吗

编辑我不明白为什么唯一约束会导致UnuniqueObjectException-您可以在没有约束的情况下尝试吗

如果问题仍然存在,您必须在同一个会话中保存该对象两次-不知道它是如何发生的,可能是通过合并先前会话中的员工来实现的


SQL查询是由唯一性约束引起的,这是正确的。

不,我没有,我已经仔细检查过了!我的employee创建表如下创建表employee id BIGINT20 NOT NULL自动增量,版本BIGINT20 NOT NULL,emp_id VARCHAR255 NOT NULL,employee类是否有静态映射字段或静态约束?还是使用Hibernate注释或XML配置?它既有静态映射又有静态约束,更新了我的问题以显示静态映射和约束。我很惊讶,如果我删除唯一性约束,它会完美工作!!为什么唯一性约束会引发select查询?只是因为需要检查它。在发出INSERT之前,您需要检查是否违反了任何约束。我想知道,如果存在数据库唯一约束,为什么Hibernate不处理SqlException/UnuniqueObjectException,但这是它的工作方式。
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]
  ......
}