2010-05-02 3 views
1

J'ai deux classes, ServiceType et ServiceRequest. Chaque ServiceRequest doit spécifier quel type de ServiceType il est. Tous les ServiceType sont prédéfinis dans la base de données et ServiceRequest est créé lors de l'exécution par le client.Mise en correspondance Hibernate avec l'objet existant

Voici mes fichiers .hbm:

<hibernate-mapping> 
    <class dynamic-insert="false" dynamic-update="false" mutable="true" name="xxx.model.entity.ServiceRequest" optimistic-lock="version" polymorphism="implicit" select-before-update="false"> 
    <id column="USER_ID" name="id"> 
     <generator class="native"/> 
    </id> 
    <property name="quantity"> 
     <column name="quantity" not-null="true"/> 
    </property> 
    <many-to-one cascade="all" class="xxx.model.entity.ServiceType" column="service_type" name="serviceType" not-null="false" unique="false"/> 
    </class> 
</hibernate-mapping> 

et

<hibernate-mapping> 
    <class dynamic-insert="false" dynamic-update="false" mutable="true" name="xxx.model.entity.ServiceType" optimistic-lock="version" polymorphism="implicit" select-before-update="false"> 
    <id column="USER_ID" name="id"> 
     <generator class="native"/> 
    </id> 
    <property name="description"> 
     <column name="description" not-null="false"/> 
    </property> 
    <property name="cost"> 
     <column name="cost" not-null="true"/> 
    </property> 
    <property name="enabled"> 
     <column name="enabled" not-null="true"/> 
    </property> 
    </class> 
</hibernate-mapping> 

Quand je cours, je reçois

com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails 

Je pense que mon problème est que lorsque je crée un Nouvel objet ServiceRequest, ServiceType est l'une de ses propriétés, et par conséquent lorsque je sauvegarde ServiceRequest à la base de données, Hibernat e tente à nouveau d'insérer l'objet ServiceType et constate qu'il existe déjà. Si c'est le cas, comment faire pour que Hibernate pointe vers le ServiceType existant au lieu d'essayer de l'insérer à nouveau?

Le code jetant l'erreur:

/* Get existing Service Type from database */ 
ServiceType st = DAOFactory.getDAOFactory().getServiceTypeDAO().getServiceType(newServiceTypeName); 

/* Set the ServiceType of the new Service Request*/ 
newServiceRequest.setServiceType(st); 

/* Error occurs inside this function which simply calls 
    session.beginTransaction(); 
    session.save(sr); 
    session.getTransaction().commit(); */ 
DAOFactory.getDAOFactory().getServiceRequestDAO().saveData(newServiceRequest); 
return "newRequestDone"; 
+0

quel est le code que vous exécutez qui cause cette exception? – oedo

+0

Cela se produit lorsque j'essaie d'enregistrer ServiceRequest. C'est juste un simple session.beginTransaction(); session.save (sr); session.getTransaction(). Commit(); –

Répondre

0

en l'absence du code qui fait l'exception, je dirais que votre problème est probable que vous essayez de créer un nouveau ServiceType pour chaque ServiceRequest alors que ce que vous devez faire est de récupérer le ServiceType existant par id plutôt que d'en ajouter un nouveau à chaque fois.

si cela ne semble pas plausible, montrez votre code java et je vais essayer aider davantage :)


aide supplémentaire: faire vos OTI utilisent la même session de mise en veille prolongée? les entités chargées d'une session et sauvegardées dans une autre peuvent causer des problèmes, sauf si vous utilisez merge au lieu de save.

+0

Je mets à jour ma question pour montrer le code. Comme vous pouvez le voir, je demande le ServiceType de la base de données, mais je l'enregistre de nouveau. –

+0

et oui, j'utilise la même session pour chaque DAO. –

+0

vous pourriez essayer de fusionner() au lieu de sauvegarder() quand même? ou encapsuler le tout dans une transaction? Sinon, je suis à court d'idées, désolé. – oedo

0

Votre exception SQL ne semble pas correspondre à l'hypothèse selon laquelle elle tente de créer un ServiceType déjà existant. Ne vous attendez pas à voir une violation de contrainte unique sur la table ServiceType? La première chose que je vérifierais en voyant ceci est la suivante: la cible FK de la base de données correspond-elle au mappage d'hibernation? Vous pouvez obtenir des choses comme ceci quand votre Entité pour ServiceType est pointée vers (BOB_DEV_SERVICE_TYPES) ​​mais la clé étrangère réelle appliquée sur le ServiceRequest va à (TINA_TEST_SERVICE_TYPES) ​​

Questions connexes