【问题标题】:ColdFusion ORM trying to insert into identity columnColdFusion ORM 试图插入标识列
【发布时间】:2015-10-15 20:00:55
【问题描述】:

我对 ColdFusion ORM 有一个奇怪的问题,它试图在创建 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 );
}

这里是休眠日志:

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

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

【问题讨论】:

  • 此时,我使用QueryExecute()至少获取一条记录到数据库中,然后从result.generatedKey中检索插入的记录。 (叹气)它很老套,但很有效......

标签: hibernate orm coldfusion coldfusion-11


【解决方案1】:

您实际上应该获取主键为 IDENTITY(1,1) 的 mssql 表 所以它会自行增加,然后你不需要给一个员工管理员

【讨论】:

  • 是的,Hibernate要我把它改成IDENTITY_INSERT = 1
【解决方案2】:

试试这个

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

【讨论】:

    【解决方案3】:

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

    但是,如果您确实需要自动生成它们,那么我会在您的事务中 EntitySave 之前的某个位置打开 IDENTITY_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' );
    }
    

    以上假设您的application.datasource 已设置 - 如果不是很明显,请将选项结构添加到queryExecute 并指定datasource 属性

    关于再次关闭 ID 插入的第二个原因(以上)的说明,请参阅remarks from Microsoft

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 2023-03-18
      • 1970-01-01
      相关资源
      最近更新 更多