2009-01-16 35 views
8

estoy recibiendo el error JDBC cuando intento una confirmación a través de hibernación a SQL Serverproblemas Hiberate, IDENTITY_INSERT JDBC se ha establecido en OFF

No se puede insertar valor explícito para la columna de identidad en la tabla 'Informe' cuando IDENTITY_INSERT es OFF

estoy usando asignaciones generadas por netbeans que contienen,

<class name="orm.generated.Report" table="Report" schema="dbo" catalog="DatabaseName"> 
    <id name="id" type="int"> 
     <column name="ID" /> 
     <generator class="assigned" /> 
    </id> 

¿Qué me parece que debería estar haciendo la iden inserte correctamente.

¿Alguna idea sobre cómo solucionar esto?

EDIT:
Algunos enlaces a la documentación, para la posteridad,
http://www.hibernate.org/hib_docs/v3/reference/en-US/html/mapping.html#mapping-declaration-id-generator
http://www.roseindia.net/hibernate/hibernateidgeneratorelement.shtml

Respuesta

8

No se puede insertar en una columna de identidad en SQL Server a menos que "IDENTITY_INSERT" está ajustado en "ON". Dado que su clase de generador está "asignada", Hibernate está asumiendo que está estableciendo un valor explícito para "id" en Java antes de guardar el objeto y que Hibernate puede insertar directamente el valor en la base de datos. Es necesario que sea:

  1. Escoja una clase generador diferente, como
  2. SET_IDENTITY_INSERT en "ON"
+0

Esto funciona, me lleva a otro error, pero funciona, Gracias. –

+0

Solo para aclarar, quise decir, al solucionar este problema, descubrí otro. –

1

Sería mejor utilizar clases de envoltura como entero en lugar de primitiva "nativo" En t.

Tomando su código como ejemplo

<class name="orm.generated.Report" table="Report" schema="dbo" catalog="DatabaseName"> 
<id name="id" type="java.lang.Integer"> 
    <column name="ID" /> 
    <generator class="assigned" /> 
</id> 
+0

Es una buena práctica en SO para agregar tantos detalles relevantes como sea posible en su publicación. Por lo tanto, aquí podría agregar ejemplos de código, por ejemplo. Eso haría su respuesta mucho más valiosa;) – ForceMagic

+1

gracias por ayudarme a salir del fango :) – nikosstais

+0

¡Gran edición!camino a seguir :) +1 – ForceMagic

1

Aquí hay algo que trabajó para mí. Adaptarse según sea necesario.

@SuppressWarnings("deprecation") 
public static void saveWithOverwrittenId(Session session, Object entity) { 
    String tableName = entity.getClass().getSimpleName(); 
    boolean identityInsertSetToOn = false; 
    try { 
     session.connection().createStatement().execute("SET IDENTITY_INSERT "+tableName+" ON"); 
     identityInsertSetToOn = true; 
     session.beginTransaction(); 
     session.saveOrUpdate(entity); 
     session.getTransaction().commit(); 
    } catch (SQLException e) { 
     session.getTransaction().rollback(); 
     throw new RuntimeException(e); 
    } finally { 
     if (identityInsertSetToOn) { 
      try { 
       session.connection().createStatement().execute("SET IDENTITY_INSERT "+tableName+" OFF"); 
      } catch (SQLException e) { 
       throw new RuntimeException(e); 
      } 
     } 
    } 
} 

En mi caso, la tabla de SQL Server tenían el mismo nombre que la clase de entidad. Para ti, esto probablemente no sea cierto. Una solución, entonces, sería preguntar el nombre de la tabla como parámetro.

+0

Tengo la misma necesidad, pero tengo que hacerlo a través de JPA. No funciona a través de JPA por alguna razón. Quiero ejecutar esta consulta a través de JPA. ¿Me puede ayudar por favor? – muasif80

+0

@ muasif80 Sugiero que cree una nueva pregunta, solicitándola específicamente (puede citar este código y solicitar un equivalente de JPA). Tendría mayores posibilidades de resolver su problema de esa manera. – acdcjunior

+0

Sí, gracias, realmente lo hice y encontré la solución. Luego respondí mi propia pregunta. Puedes encontrar esa pregunta debajo de mi perfil. – muasif80

1

cambiar el tipo de la clase generador

ANTES

<id name="id" type="long"> 
     <column name="Id" /> 
     <generator class="assigned" /> 
    </id> 

DESPUÉS

<id name="id" type="long"> 
     <column name="Id" /> 
     <generator class="native" /> 
    </id> 

Ahora bien, esto va a funcionar!

1

tratar de cambiar el tipo de generador de la clase de 'asignado' a la 'identidad', que trabajó para mí

Cuestiones relacionadas