Mam pytanie podobne do @ManyToMany without join table (legacy database) z dodatkowym problemem.Mapowanie bazy danych tylko do odczytu z relacją wiele do wielu bez tabeli łączenia
że dwie tabele A
i B
A
z kluczem wielokolumnowy podstawowej (ID
iID2
)B
kluczem wielokolumnowy podstawowej (ID
iID3
)
Wiersz w A
może odwoływać się do kilku wierszy w B
(B.ID = A.ID
) i wiersz B
można odwoływać się przez kilka wierszy w A
.
EDIT: baza danych jest starą bazą danych tylko do odczytu, której nie można zmienić. Nie muszę mapować relacji z JPA (mógłbym to zrobić w logice programu z dodatkowymi wyborami), ale byłoby miło.
Jest to w zasadzie relacja wiele do wielu bez tabeli sprzężenia. Ponieważ, jak w przypadku połączonego pytania, po prostu muszę czytać tabele, próbowałem z dwoma relacjami jeden do wielu w obu klasach.
Dodatkowym problemem, który mam, jest to, że zarówno ID
s używane do łączenia nie są kluczem podstawowym.
Mam następujących klas:
@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;
}
Hibernacja generuje następujący błąd:
Exception while preparing the app : referencedColumnNames(ID) of package.B referencing package.A not mapped to a single property
naprawdę nie dostaję komunikat: B.id
odwołuje się do pojedynczego obiektu A
(A.id
) .
Edycja: a o:
public class PrimaryKeysA implements Serializable {
private static final long serialVersionUID = 1L;
private int id1;
private int id2;
// getters/setters/equals/hashcode
}
PrimaryKeysB
jest podobna id3 zamiast ID2. Obie klasy: A
i B
są uproszczonymi (anonimowymi) przykładami.
Naprawdę nie widzę, jak można mieć wiele-do-wielu z tymi tabelami. O identyfikatorze B.ID B.ID i B.ID jest kluczem podstawowym B. Tak więc dany A może odnosić się tylko do jednego B. Po prostu masz powiązanie ManyToOne od A do B. –
Ooops przepraszam, że mam to samo na A jak w B. Będę edytować pytanie (próbowałem wygenerować uproszczony przykład idący zbyt daleko) – Matteo
To nie jest wiele powiązań między dwiema tabelami ... Dlaczego używasz dwóch identyfikatorów na każdej tabeli? Czy masz możliwość zmiany tego schematu na bardziej standardową formę lub czy jest to starsza baza danych? Jeśli nie jest to starsza baza danych, dlaczego nie używasz tabeli łączenia, jeśli chcesz powiązać wiele do wielu? –