2009-01-16 6 views
8

J'obtiens l'erreur JDBC lorsque je tente une validation par mise en veille prolongée vers SQL Serverproblèmes Hiberate, IDENTITY_INSERT jdbc est réglé sur OFF

Impossible d'insérer la valeur explicite pour la colonne d'identité dans le tableau « Rapport » quand IDENTITY_INSERT est réglé OFF

J'utilise les correspondances générées par NetBeans qui contiennent,

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

ce qui me semble comme il devrait faire l'iden insérer correctement.

Une idée sur la façon de résoudre ce problème?

EDIT:
Quelques liens vers la documentation, pour la postérité,
http://www.hibernate.org/hib_docs/v3/reference/en-US/html/mapping.html#mapping-declaration-id-generator
http://www.roseindia.net/hibernate/hibernateidgeneratorelement.shtml

Répondre

8

Vous ne pouvez pas insérer dans une colonne d'identité dans SQL Server, sauf si "IDENTITY_INSERT" est réglé sur "ON". Puisque votre classe de générateur est "affectée", Hibernate suppose que vous définissez une valeur explicite pour "id" en Java avant d'enregistrer l'objet et que Hibernate peut directement insérer la valeur dans la base de données. Vous devez soit:

  1. Choisissez un autre classe de générateur, comme « natif »
  2. Set IDENTITY_INSERT sur « ON »
+0

Cela fonctionne, me conduit dans une autre erreur, mais cela fonctionne, merci. –

+0

Juste pour clarifier, je voulais dire, en corrigeant ce problème, j'en ai découvert un autre. –

1

Il serait préférable d'utiliser les classes wrapper comme entier au lieu de primitive int.

Prendre votre code comme exemple

<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

C'est une bonne pratique sur SO d'ajouter autant de détails pertinents que vous pouvez dans votre message. Ainsi, vous pouvez ici ajouter un exemple de code. Cela rendrait votre réponse beaucoup plus précieuse;) – ForceMagic

+1

merci de m'avoir aidé à sortir de la boue :) – nikosstais

+0

Great edit!chemin à parcourir :) +1 – ForceMagic

1

Voici quelque chose qui a fonctionné pour moi. Adapter au besoin.

@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); 
      } 
     } 
    } 
} 

Dans mon cas, la table SQL Server avait le même nom que la classe Entity. Pour vous, ce n'est probablement pas vrai. Une solution, alors, serait de demander le nom de la table en tant que paramètre.

+0

J'ai le même besoin mais je dois le faire via JPA. Il ne fonctionne pas via JPA pour une raison quelconque. Je veux lancer cette requête via JPA. Pouvez-vous aider s'il vous plaît? – muasif80

+0

@ muasif80 Je vous suggère de créer une nouvelle question, en demandant spécifiquement que (citant ce code et demandant un équivalent JPA). Vous auriez plus de chances d'avoir votre problème résolu de cette façon. – acdcjunior

+0

Oui merci j'avais effectivement fait cela et j'ai trouvé la solution. Puis j'ai répondu à ma propre question. Vous pouvez trouver cette question sous mon profil. – muasif80

1

Changer le type de la classe de générateur

AVANT

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

APRÈS

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

Maintenant cela va fonctionner!

1

essayer de changer le type de la classe de générateur de « attribué » à « identité », il a travaillé pour moi