tutorial for driver_class conectar con cfg sql sql-server hibernate jdbc

for - jdbc sql server



Problemas de Hiberate, jdbc IDENTITY_INSERT está establecido en OFF (5)

No puede insertar en una columna de identidad en SQL Server a menos que "IDENTITY_INSERT" esté configurado 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. Necesitas:

  1. Elija una clase de generador diferente, como "nativo"
  2. Establezca IDENTITY_INSERT en "ON"

Recibo un error JDBC cuando intento una confirmación a través de hibernación a SQL Server

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

Estoy usando mapeos generados 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>

Que me parece que debería estar haciendo la inserción de identidad correctamente.

Alguna idea de como arreglar esto?

EDITAR:
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


Aquí hay algo que funcionó 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ía el mismo nombre que la clase Entity. Para ti, esto probablemente no sea cierto. Una solución, entonces, sería preguntar el nombre de la tabla como parámetro.


Cambiar el tipo de la clase de generador

ANTES DE

<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 esto funcionará!


tratar de cambiar el tipo de clase del generador de ''asignado'' a ''identidad'', funcionó para mí


Sería mejor usar clases de contenedor como Integer en lugar de primitive int.

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>