Newsgroup: it.comp.java
Titolo: hibernate chiave esterna

Mi rivologo a chi usa Hibernate.
Mi trovo a gestire un database legacy.
Vorrei sapere se si puo', e come, definire in una classe una relazione
con una classe figlia dove la chiave esterna non si riferisce all'id
della tabella figlia ma ad un campo diverso.
Anche la relazione esterna non raggiunge il campo id del padre.
Mi spiego:
+----------------+           +---------------------+
| Prodotto:      |           |SottoProdotto        |
+----------------+           +---------------------+
| id             |           | id                  |
| codiceProdotto | 1 <---> + | codiceProdotto      |
| descrizione    |           | codiceSottoProdotto |
+----------------+           | descrizione         |
                             +---------------------+
Prodotto.hbm.xml
<class name="Prodotto" table="PRODOTTI">
 <id name="id" column="ID" type="integer" unsaved-value="null">
  <generator class="increment"></generator>
 </id>
 <property name="codiceProdotto" column="CODICE" length="20"
not-null="true" unique="true"/>
 <property name="descrizione" column="DESCRIZIONE" unique="false"
length="30" not-null="true"/>
 <set name="sottoprodotti" cascade="all" inverse="true" lazy="true">
  <key column="CODICE"></key>
  <one-to-many class="SottoProdotti"></one-to-many>
 </set>
</class>
SottoProdotto.hbm.xml
<class name="SottoProdotto" table="SOTTOPRODOTTI">
 <id name="id" column="ID" type="integer" unsaved-value="null">
  <generator class="increment"></generator>
 </id>
 <property name="codiceSottoProdotto" column="CODICE" length="20"
not-null="true" unique="true"/>
 <property name="descrizione" column="DESCRIZIONE" unique="false"
length="30" not-null="true"/>
 <many-to-one name="prodotto" property-ref="codiceProdotto"
class="Prodotto" foreign-key="codiceProdotto">
  <column name="codiceProdotto" length="20" />
 </many-to-one>
</class>

                              +---------------------+
Non ho provato il codice che hai allegato, che problemi hai ?
Ciao
Nic

 Anche la relazione esterna non raggiunge il campo id del padre.
IMHO, nel caso che hai presentato, trovo una forzatura doverlo fare. La
cosa giusta da fare è legare regolarmente le due tabelle con una
contraint per chiave primaria (idProdotto su sottoprodotto, oppure
codiceProdotto come id "assigned" su Prodotto) perchè questa è la
rappresentazione corretta del caso. E l'integrità dei dati l'avresti
garantita dal db (anche in questo caso sarebbe raccomandabile garantirla
con i trigger).
In ogni modo, quello che hai scritto mi sembra corretto. Qual'è il
problema?

Sono un newbie hibernate. Avevo provato ad utilizzare "assigned" ma mi
ero perso, ci riprovero'.
Il problema della mia soluzione e' che non e' previsto un
property-ref="codiceProdotto" in set.
Sto utilizzando Hibernate 2.1, proverò con il 3.x.x  infatti nella
pagina Road Map di 
hibernate.org
 (
http://www.hibernate.org/200.html
)
leggo:
- collection keys may now specify a property-ref, allowing mapping of
associations that do not reference primary keys.
Vi faro' sapere.

 Vi faro' sapere.
Continuo a rispondermi da solo ...
Infatti con hibernate 3.1 :
<class name="SottoProdotto" table="SOTTOPRODOTTI">
	<id name="id" column="ID" type="integer" unsaved-value="null">
		<generator class="increment"></generator>
	</id>
	<property name="codiceSottoProdotto" column="CODICE" length="20"
		not-null="true" unique="true" />
	<property name="descrizione" column="DESCRIZIONE" unique="false"
		length="30" not-null="true" />
	<many-to-one name="prodotto"
8-;->           property-ref="codiceProdotto"
		class="Prodotto">
