Ho una domanda simile a @ManyToMany without join table (legacy database) con un ulteriore problema.Mapping di un database di sola lettura con una relazione molti-a-molti senza una tabella di join
ho due tabelle A
e B
A
con una chiave multipla colonna primaria (ID
eID2
)B
con una chiave multipla colonna primaria (ID
eID3
)
Una riga in A
può fare riferimento a più righe in B
(B.ID = A.ID
) e una riga in B
può essere referenziata da più righe in A
.
EDIT: il database è un database legacy di sola lettura che non posso modificare. Non ho bisogno di mappare le relazioni con JPA (potrei farlo nella logica del mio programma con selezioni aggiuntive) ma sarebbe bello.
È fondamentalmente una relazione molti-a-molti senza una tabella di join. Dato che, come per la domanda collegata, devo solo leggere le tabelle, ho provato con due relazioni uno-a-molti in entrambe le classi.
Il problema aggiuntivo che ho è che entrambi i ID
s utilizzati per il join non sono la chiave primaria.
ho le seguenti classi:
@Entity
@Table(name = "A")
@IdClass(PrimaryKeysA.class)
public class A {
@Id
@Column(name = "ID", insertable = false, updatable = false, columnDefinition = "char")
private String id;
@Id
@Column(name = "ID2", insertable = false, updatable = false)
private int id2;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "ID", columnDefinition = "char", referencedColumnName = "ID")
private Set<B> setOfBs;
}
@Entity
@Table(name = "B")
@IdClass(PrimaryKeysB.class)
public class B {
@Id
@Column(name = "ID", insertable = false, updatable = false, columnDefinition = "char")
private String id;
@Id
@Column(name = "ID3", insertable = false, updatable = false)
private int id3;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "ID", columnDefinition = "char", referencedColumnName = "ID")
private Set<A> setOfAs;
}
Hibernate genera il seguente errore:
Exception while preparing the app : referencedColumnNames(ID) of package.B referencing package.A not mapped to a single property
Io davvero non capisco il messaggio: B.id
fa riferimento a un singolo immobile in A
(A.id
) .
EDIT: come richiesto:
public class PrimaryKeysA implements Serializable {
private static final long serialVersionUID = 1L;
private int id1;
private int id2;
// getters/setters/equals/hashcode
}
PrimaryKeysB
è simile con ID3 invece di ID2. Entrambe le classi A
e B
sono esempi semplificati (resi anonimi).
Non vedo davvero come si possa avere un numero molti con queste tabelle. Riferimenti A.ID B.ID e B.ID è la chiave primaria di B. Quindi una data A può fare riferimento solo a una B. Hai solo un'associazione ManyToOne da A a B. –
Ooops mi dispiace ho lo stesso su A come in B. Io modifico la domanda (ho provato a generare un esempio semplificato andando troppo lontano) – Matteo
Questa non è un'associazione molti a molti tra due tabelle ... Perché stai usando due ID su ogni tabella? Avete la possibilità di cambiare questo schema in un modulo più standard o si tratta di un database legacy? Se non si tratta di un database precedente, qual è la ragione per cui non si utilizza una tabella di join se si desidera un'associazione many-to-many? –