ColdFusion ORM пытается вставить в столбец идентификаторов

У меня странная проблема с 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 );
}

А вот журнал 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

Как видите, он пытается вставить в столбец StaffAdminID то, что я предполагаю, это null. Я не уверен, что происходит, я даже пытался установить dynamicInsert=true в компоненте. Любые идеи будут отличными! Спасибо


person Panman    schedule 25.07.2015    source источник
comment
На данный момент я использую QueryExecute(), чтобы по крайней мере получить запись в базу данных, а затем получить вставленную запись из result.generatedKey. (вздох) Это хакерски, но работает...   -  person Panman    schedule 28.07.2015


Ответы (3)


На самом деле вы должны получить таблицу mssql с первичным ключом как IDENTITY (1,1), чтобы она увеличивалась, и тогда вам не нужно указывать один staffadminid

person Guilherme Silva    schedule 27.07.2015
comment
Это так, Hibernate хочет, чтобы я изменил его на IDENTITY_INSERT = 1. - person Panman; 27.07.2015

попробуй это

property name="StaffAdminID" fieldtype="id" column="StaffAdminID" generator="identity" setter="false";
person kishore.k.vaishnav    schedule 03.11.2017

Ответ сводится к тому, нужно ли автоматически генерировать значения в вашем поле StaffAdminID. Поскольку вы вставляете идентификатор из области запроса, я предполагаю, что вы не создаете новые записи StaffAdmin, поэтому вы можете полностью удалить IDENTITY в поле и не иметь проблем (если где-то есть другая таблица, которая генерирует идентификаторы автоматически, это не означает, что таблица StaffAdmin тоже нуждается в IDENTITY).

Однако, если вам нужно, чтобы они генерировались автоматически, я бы включил IDENTITY_INSERT где-то перед EntitySave в вашей транзакции следующим образом:

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

Для уточнения второй причины (выше) повторного отключения вставки идентификатора см. примечания от Microsoft

person James Cushing    schedule 09.05.2018