2015-07-17 17 views
10

Hi Ho 2 tabelle come di seguitoHibernate Molti a uno Mapping con diverso numero di colonne

Table1:

 

    +-------------------+ 
    | ID LOB col1 col2 | 
    +-------------------+ 

chiave primaria (ID e LOB)

Tabella2:

 

    +-----------------+ 
    | SK ID col3 col4 | 
    +-----------------+ 

chiave primaria (SK)

ho necessità di dare un molti a uno relazione dalla tabella 2 a table1, dal momento che table1 ha compositePrimaryKey (ID e LOB) ma table2 non ha alcuna colonna correlata a LOB. Non riesco a fornire la mappatura. Si prega di aiuto su questo.

EDIT ho cercato di mapping Hibernate per Table2:

<many-to-one name="class1Obj" class="com.acs.enterprise.common.Class1" 
      lazy="proxy" insert="false" update="false"> 
    <column name="ID" /> 
    <column name="LOB" /> 
</many-to-one> 

È possibile che questo non funziona. Durante il recupero di un record che tenta di recuperare il codice pallonetto da table2 che non è affatto esiste in Table1

+0

Vuoi pubblicare il codice per entrambe le classi e l'output che stai ottenendo. –

+0

Se la seconda tabella non ha riferimenti a LOB di quanto non sia possibile mappare la chiave composta. Puoi aggiungere una colonna LOB a table2? – Hace

risposta

2

Supponendo table2.SK è un FK a table1.ID e non ci sono table1 voci aventi lo stesso ID, si può scrivere la mappatura nel modo seguente:

@ManyToOne 
@JoinColumn(name = "ID", insertable = false, updatable = false) 
private Class1 class1Obj; 

Se ci sono più table1 righe con lo stesso ID, la mappatura non riuscirà, perché un bambino sarebbe quindi essere abbinata a più genitori.

Quindi, per un'associazione many-to-one corretta è necessario un FK per una colonna padre che è univoco.

+0

Grazie per la risposta, ma il mapping sopra non funziona poiché table1 ha l'ID composito dichiarato nella mappatura ibernata, molti-a-uno chiede anche lo stesso numero di colonne – Siva

+0

So che funziona con le annotazioni JPA, ma per il vecchio Hibernate specifiche configurazioni XML, non sono sicuro di quale sia l'equivalente. –

0

Hibernate @Id non deve corrispondere alla chiave primaria del database reale (sebbene sia auspicabile che corrispondano, ovviamente).

Se ID è una colonna unica in Table1, quindi mappare Hibernate id solo ad esso, e lasciare LOB come solo un campo normale.

Se ID non è una colonna univoca, quindi il tuo molti-a-uno non funzionerà correttamente in ogni caso, perché ci sarebbero più righe corrispondenti nella tabella di riferimento.

-1
@Entity 
@Table(name="Table_name") 
public class table_name { 
@EmbeddedId 
@AttributeOverrides({ 
@AttributeOverride(name = "id1", column = @Column(name = "col1")), 
@AttributeOverride(name = "id2", column = @Column(name = "col2")) }) 
+4

Potresti aggiungere qualche spiegazione alla tua risposta? – madshvero

+1

Grazie per questo snippet di codice, che potrebbe fornire un aiuto limitato e immediato. A [spiegazione corretta] (https://meta.stackexchange.com/q/114762/349538) migliorerebbe notevolmente il suo valore a lungo termine, mostrando perché questa è una buona soluzione al problema e renderebbe più utile ai futuri lettori con altre domande simili. Per favore [modifica] la tua risposta per aggiungere qualche spiegazione, incluse le ipotesi che hai fatto. –

Problemi correlati