Hibernate ColdFusion表单试图插入到标识列中

Hibernate ColdFusion表单试图插入到标识列中,hibernate,orm,coldfusion,coldfusion-11,Hibernate,Orm,Coldfusion,Coldfusion 11,我对ColdFusion Form有一个奇怪的问题,它在创建EntityNew()然后创建EntitySave()之后,试图在我的标识列中插入一个值。以下是特定的属性定义: property name='StaffAdminID' fieldType='id' type='numeric' ormType='integer' generator='identity' setter=false insert=false update=fals

我对ColdFusion Form有一个奇怪的问题,它在创建
EntityNew()
然后创建
EntitySave()
之后,试图在我的标识列中插入一个值。以下是特定的属性定义:

property name='StaffAdminID'
    fieldType='id'
    type='numeric'
    ormType='integer'
    generator='identity'
    setter=false
    insert=false
    update=false;
下面是创建新记录的代码:

transaction {
    LOCAL.staffAdmin = EntityNew('StaffAdmins');
    LOCAL.staffAdmin.setYear( REQUEST.user.getYear() );
    LOCAL.staffAdmin.setStaff( LOCAL.staff );
    LOCAL.staffAdmin.setAdmin( LOCAL.admin );
    LOCAL.staffAdmin.setAddedOn( Now() );
    LOCAL.staffAdmin.setAddedBy( SESSION.username );
    LOCAL.staffAdmin.setAddedID( REQUEST.user.getStaffID() );
    EntitySave( LOCAL.staffAdmin );
}
下面是Hibernate日志:

2015-07-24 21:49:20,108 [ajp-bio-8014-exec-6] Hibernate DEBUG org.hibernate.SQL - 
    insert 
    into
        StaffAdmins
        (AddedOn, AddedBy, AddedID, YearID, StaffEnrollmentID, AdminEnrollmentID, StaffAdminID, StaffID, AdminID) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?, ?)
这将导致以下错误:

coldfusion.orm.hibernate.HibernateSessionException:
[Macromedia][SQLServer JDBC Driver][SQLServer]
Cannot insert explicit value for identity column in
table 'StaffAdmins' when IDENTITY_INSERT is set to OFF

正如您所看到的,它试图插入到
staffadmin
列中,我假设
null
。我不确定发生了什么,我甚至尝试在组件上设置
dynamicInsert=true
。任何想法都会很棒!谢谢

您应该实际获得主键作为标识(1,1)的mssql表 所以它会自动递增,然后你不需要给一个staffadmin,试试这个

property name="StaffAdminID" fieldtype="id" column="StaffAdminID" generator="identity" setter="false";

答案归结为您的
staffadmin
字段中的值是否需要自动生成。由于您是从请求范围插入ID,因此我假设您不会生成新的
StaffAdmin
条目,因此您可以将
标识完全删除到字段中,而不会出现问题(如果有另一个表可以自动生成ID,这并不意味着
StaffAdmin
表也需要
IDENTITY

但是,如果您确实需要自动生成它们,那么我会在事务中的
EntitySave
之前的某个位置打开
IDENTITY\u INSERT
,如下所示:

transaction{
    LOCAL.staffAdmin = EntityNew('StaffAdmins');
    LOCAL.staffAdmin.setYear( REQUEST.user.getYear() );
    LOCAL.staffAdmin.setStaff( LOCAL.staff );
    LOCAL.staffAdmin.setAdmin( LOCAL.admin );
    LOCAL.staffAdmin.setAddedOn( Now() );
    LOCAL.staffAdmin.setAddedBy( SESSION.username );
    LOCAL.staffAdmin.setAddedID( REQUEST.user.getStaffID() ); 

    // This statement should turn IDENTITY_INSERT on for the rest of the transaction
    identityOn = queryExecute( 'SET IDENTITY_INSERT StaffAdmin ON' );

    // Save the entity (while IDENTITY_INSERT is on)
    EntitySave( LOCAL.staffAdmin );

    // Turn IDENTITY_INSERT off again for two reasons:
    // 1. Prevents accidental ID inserts by others
    // 2. Prevents an error being thrown when trying to set IDENTITY_INSERT on for another table
    identityOff = queryExecute( 'SET IDENTITY_INSERT StaffAdmin OFF' );
}
以上假设您的
应用程序.datasource
已设置-如果没有明显设置,请将options struct添加到并指定
datasource
属性


要澄清再次关闭ID插入的第二个原因(如上),请参见

,Hibernate希望我将其更改为IDENTITY_insert=1此时,我正在使用
QueryExecute()
至少将一条记录获取到数据库中,然后从
结果中检索插入的记录。generatedKey
(叹气)这很粗糙,但很有效。。。