Hibernate ColdFusion表单试图插入到标识列中
我对ColdFusion Form有一个奇怪的问题,它在创建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
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
(叹气)这很粗糙,但很有效。。。