gorm save方法导致选择查询触发

我正在使用grails 1.3.7和zkoss,并且我的域模型如下所示,我在会话1中加载Person实体,并通过UI对其进行更改。

在会话2中单击保存时,我要保存实体。

因此,从我的作曲者/控制器中,我调用了一个服务方法(transactional),然后调用了person.save(),当我看到被触发的sql查询时,我看到了一个试图检索雇员对象的查询。

之后,保存被触发并引发nonuniqueobjectexception Exception

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]

......

}

这种行为正确吗?

回答:

您必须在Employee映射empId中将其指定为主键-这可能是的唯一原因NonUniqueObjectException

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

为什么不使用Grails / Hibernate隐式id,您是否在使用具有特定映射的旧数据库?

我看不到为什么唯一约束会导致NonUniqueObjectException-您能否在没有约束的情况下尝试?

如果问题仍然存在,则必须在同一会话中两次保存对象-不知道它如何发生,也许是通过在较早的会话中merge()启用了对象Employee

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

以上是 gorm save方法导致选择查询触发 的全部内容, 来源链接: utcz.com/qa/432236.html

回到顶部