2012-11-10 10 views
6

Sto utilizzando Hibernate 3.2.5. Sto ottenendo l'eccezione di cui sopra mentre utilizzo il mapping molti-a-uno. Il tavolo di allenamento ha una relazione molti a uno con la tabella del Dipartimento, ovvero un Depostoment è in grado di eseguire più di un allenamento.org.hibernate.MappingException: colonna ripetuta nella mappatura per l'entità

L'eccezione mi sta chiedendo di aggiungere insert="false" update="false" nel mio file hbm. Se aggiungo questo bit nel file hbm, il codice funziona correttamente.

Ecco il file 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> 

Se cambio questa linea:

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

Poi il codice funziona. Voglio sapere qual è il motivo esatto per aggiungere questo.

saluti,

risposta

7

è stata mappata la colonna dept_id due volte, qui:

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

E qui:

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

Quando si esegue un'istruzione select, Hibernate andrà bene popolando due proprietà del vostro oggetto dalla stessa colonna, tuttavia quando si esegue un inserimento o un aggiornamento non è possibile decidere quale proprietà deve persistere nel database.

Perché sono necessarie due proprietà associate alla stessa colonna in primo luogo? Se è necessario l'accesso al deptid, probabilmente si può rimuovere la proprietà deptid e invece fare

training.getDepartmentDetails().getId() 
5

Il messaggio di errore per questo scenario è abbastanza chiaro (non hai messo qui, ma ho visto un paio di volte). Il problema è che hai mappato la colonna DEPT_ID in due campi diversi della tua classe.

Innanzitutto, l'hai mappato alla proprietà deptId e poi a departmentDetails. Come hai scoperto, l'ibernazione consente di farlo solo se uno dei mapping è configurato per essere insert="false" update="false".

Il motivo è piuttosto semplice. Se si modifica deptId in un altro id, la sospensione dovrebbe modificare la classe mappata in departmentDetails, che è piuttosto complicata.

se è necessario ottenere il deptId, è possibile aggiungere un metodo getDeptId su Training che restituisce departmentDetails.getId(). E non fornire un setDeptId.

1

Se si utilizza lo stesso nome di colonna per due volte nel file di mapping. potrebbe essere che si ottiene la mappatura delle eccezioni

Initial SessionFactory creation failed.org.hibernate.MappingException: 

anche se u marcatore d'inserimento = flase e l'aggiornamento = false.

se si tenta di aggiornare o inserire nei record nella tabella o in un altro sistema legacy provare ad aggiornare questi valori di colonna. non aggiornerebbe o inserirà quello archiviato.

Si prega di controllare il link qui sotto .it vi aiuterà a trovare le vostre soluzioni.

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

Grazie Sandeep G.

Problemi correlati