У меня есть вопрос, похожий на @ManyToMany без таблицы соединений (устаревшая база данных) с дополнительной проблемой.
У меня есть две таблицы A
и B
-
A
с помощью первичного ключа с несколькими столбцами (ID
иID2
) -
B
с помощью первичного ключа с несколькими столбцами (ID
иID3
)
Строка в A
может ссылаться на несколько строк в B
(B.ID = A.ID
), а строка в B
может ссылаться на несколько строк в A
.
EDIT: база данных - это устаревшая база данных только для чтения, которую я не могу изменить. Мне не нужно сопоставлять отношения с JPA (я мог бы просто сделать это в своей логике программы с дополнительными выделениями), но было бы неплохо.
Это в основном отношение "многие ко многим" без таблицы соединений. Поскольку, поскольку для связанного вопроса, я просто должен прочитать таблицы, я пробовал с двумя отношениями один-ко-многим в обоих классах.
Дополнительная проблема, которую я испытываю, заключается в том, что оба ID
, используемые для соединения, не являются первичным ключом.
У меня есть следующие классы:
@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;
}
Спящий режим генерирует следующую ошибку:
Exception while preparing the app : referencedColumnNames(ID) of package.B referencing package.A not mapped to a single property
Я действительно не получаю сообщение: B.id
ссылается на одно свойство в A
(A.id
).
EDIT: по запросу:
public class PrimaryKeysA implements Serializable {
private static final long serialVersionUID = 1L;
private int id1;
private int id2;
// getters/setters/equals/hashcode
}
PrimaryKeysB
похож на id3 вместо id2. Оба класса A
и B
являются упрощенными (анонимизированными) примерами.