2010-07-01 7 views
3

Je vais avoir des problèmes en utilisant Hibernate et SQL Server 2008. Lorsque je tente de sauver un objet à la base de données Hibernate lance ceci:Problème d'utilisation Hibernate et SQL Server 2008

could not retrieve snapshot: com.my.MyClass 

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name `'emanagement.patient_visit'.` 

L'utilisateur a select, insert, mise à jour privilèges dans la base de données. J'ai donc réglé ce problème.

C'est le SQL généré:

select 
     patientvis_.account_number, 
     patientvis_.status as status1_, 
     patientvis_.cpt_code as cpt3_1_, 
     patientvis_.locked as locked1_, 
     patientvis_.state as state1_, 
     patientvis_.userid as userid1_ 
    from 
     emanagement.patient_visit patientvis_ 
    where 
     patientvis_.account_number=? 

Si je lance le SQL ci-dessus dans SQL Server, il dit le nom d'objet non valide emanagement.patient_visit, mais si j'ajoute manuellement que emanagement.dbo.patient_visit « dbo » que il sera exsecuted.

Y a-t-il une autre configuration Hibernate à faire?

Ceci est mon mappage Hibernate. Le mapping ci-dessous fonctionne sous MySQL. Je peux lire et mettre à jour patient_visit dans la base de données. Mais lors du passage à MS Server, il échoue. J'ai essayé d'autres mappages Hibernate qui fonctionnent pour MySQL et MS Server et ils utilisent tous les deux les mêmes déclarations que ci-dessous comme table = "db_table" schema = "my_database". La seule différence est que j'ai créé cette nouvelle base de données d'emanagement sous MS Server, donc je pense que j'ai manqué une configuration de base de données spécifique sur l'outil de gestion MS Server. La seule façon de prouver cela est de déplacer les nouvelles tables d'emanagement vers une base de données existante et de voir si cela fonctionne.

<class name="com.domain.patient.model.PatientVisit" table="patient_visit" schema="emanagement"> 
     <id name="accountNumber" type="java.lang.Long"> 
      <column name="account_number" precision="22" scale="0" /> 
      <generator class="assigned"/> 
     </id> 
     <property name="status" type="string"> 
      <column name="status"/> 
     </property> 
     <property name="cptCode" type="string"> 
      <column name="cpt_code"/> 
     </property> 
     <property name="locked" type="boolean"> 
      <column name="locked" precision="1" scale="0"/> 
     </property> 
     <property name="state" type="string"> 
      <column name="state"/> 
     </property> 
     <property name="userId" type="string"> 
      <column name="userid"/> 
     </property> 
       <set name="documents" lazy="false"> 
      <key column="account_number"/> 
      <one-to-many class="com.domain.document.model.Document"/> 
     </set>  
    </class> 

Merci d'avance.

Répondre

5

Alors, y a-t-il d'autres configurations Hibernate à faire?

Avec votre configuration actuelle, je suppose que vous devrez spécifier le schéma. Par exemple, dans la mise en correspondance:

<class name="Users" table="Users" schema="dbo" catalog="suiteaccess"> 

Mais vous pouvez également spécifier le schéma par défaut en utilisant la propriété hibernate.default_schema (voir 3.4. Optional configuration properties). Dans le cas, vous pouvez create your own schema.

+1

Pour construire o Dans la réponse de Pascal, il semble que vous ayez spécifié le nom de la base de données où le nom du schéma devrait se trouver dans votre configuration. La plupart des ORMs que j'ai vus n'utilisent pas un schéma de nommage en 3 parties pour l'accès, donc je dois imaginer que c'est une mauvaise configuration. – Anon246

+1

Sa cause étrange, j'ai d'autres mappages d'objets Hibernate ils sont enregistrés correctement dans SQL Server.Mais pour ceux que j'utilise Spring Framework. – Marquinio

+0

@Strommy @Marquinio Il serait intéressant de voir la configuration d'hibernation (et peut-être les mappages pour deux entités représentatives). –

0

Modifiez le schéma en dbo. Dans SQL Server, schéma est un conteneur dans la base de données, pas la base de données elle-même. Cela peut être différent dans MySQL, mais dans ce cas, votre schéma doit être dbo (basé sur vos commentaires sur ce travail si vous ajoutez « dbo. » À votre requête résultante.

Merci, Eric

0

Put ci-dessous la configuration dans le fichier de mappage. Il a décidé l'exception d'objet non valide.

<class name="Users" table="databaseName.dbo.Users"> 

Modifiez la ligne ci-dessus dans le fichier de mappage. Il doit être le travail. comme serveur MSSQL ont schéma par défaut (dbo). Voilà pourquoi utiliser la table entièrement classée nom

+0

S'il vous plaît n'oubliez pas de regarder l'aperçu avant de poster. Si vous ajoutez du code, vous devez ajouter 4 espaces avant le code. Et bienvenue à la pile, espérons que vous l'aimerez. – CodeTower