2012-11-10 9 views
6

Używam Hibernate 3.2.5. Otrzymuję powyższy wyjątek podczas korzystania z mapowania wiele-do-jednego. Tabela treningowa ma wiele do jednej relacji z tabelą Departamentu, tzn. One Depatement może brać więcej niż jeden trening.org.hibernate.MappingException: Powtarzana kolumna w odwzorowaniu dla jednostki

Wyjątek z prośbą o dodanie insert="false" update="false" w pliku hbm. Jeśli dodaję ten bit w pliku hbm, kod działa poprawnie.

Oto plik HBM:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 

    <class name="com.infy.model.Training" table="training"> 
    <id name="Id" type="integer" column="ID"> 
     <generator class="assigned"></generator> 
    </id>  
    <property name="trainerName"> 
     <column name="TRAINER_NAME"></column> 
    </property> 
    <property name="deptId"> 
     <column name="DEPT_ID"></column> 
    </property> 
    <property name="trainingSubject"> 
     <column name="TRAINING_SUBJECT"></column> 
    </property> 
    <many-to-one name="departmentDetails" column="DEPT_ID"></many-to-one> 
    </class> 
</hibernate-mapping> 

Jeśli zmienić ten wiersz na:

<many-to-one name="departmentDetails" column="DEPT_ID" insert="false" update="false"></many-to-one> 

Następnie kod działa. Chcę wiedzieć, jaki jest dokładny powód dodania tego.

Pozdrawiam,

Odpowiedz

7

Masz odwzorowane kolumnę DEPT_ID dwukrotnie tutaj:

<property name="deptId"> 
     <column name="DEPT_ID"></column> 
    </property> 

A tutaj:

<many-to-one name="departmentDetails" column="DEPT_ID"></many-to-one> 

Podczas wykonywania instrukcji select, Hibernate będzie dobrze zapełnianie dwie właściwości swojego obiektu z tego samego kolumna, jednak przy wykonywaniu wstawiania lub aktualizacji nie może zdecydować, która właściwość ma pozostać w bazie danych.

Dlaczego potrzebne są dwie właściwości odwzorowane w tej samej kolumnie? Jeśli potrzebujesz dostępu do deptId, prawdopodobnie można usunąć właściwość deptId i zamiast zrobić

training.getDepartmentDetails().getId() 
5

Komunikat o błędzie dla tego scenariusza jest całkiem jasne (nie umieścić go tutaj, ale widziałem to kilka razy). Problem polega na tym, że zmapowano kolumnę DEPT_ID na dwa różne pola w klasie.

Najpierw zmapowałeś go do nieruchomości deptId, a następnie do departmentDetails. Jak się dowiedziałeś, hibernacja pozwala to zrobić tylko wtedy, gdy jedno z mapowań jest skonfigurowane jako insert="false" update="false".

Powód jest dość prosty. Jeśli zmieniłbyś deptId na inny id, hibernacja musiałaby zmienić klasę odwzorowaną w departmentDetails, co jest dość skomplikowane.

Jeśli potrzebujesz uzyskać deptId, możesz dodać metodę getDeptId na Training, która zwraca departmentDetails.getId(). I nie dostarczaj setDeptId.

1

jeśli używasz tej samej nazwie kolumny dwukrotnie w pliku odwzorowania. możliwe, że dostaniesz mapowanie Wyjątek

Initial SessionFactory creation failed.org.hibernate.MappingException: 

Również, jeśli u oznaczacie insert = flase i update = false.

jeśli próbujesz zaktualizować lub wstawić do rekordów w tabeli lub innym starszym systemie spróbuj zaktualizować te wartości kolumny. nie zaktualizuje ani nie wstawi tego pliku.

Proszę sprawdzić poniższy link. Pomoże to znaleźć rozwiązania.

http://www.techienjoy.com/hibernate-insert-update-control.php

Dzięki Sandeep G.

Powiązane problemy