Hibernate внешний ключ с частью составного первичного ключа
Я должен работать с Hibernate, и я не очень уверен, как решить эту проблему, у меня есть 2 таблицы с 1..N отношения, подобные этому:
-------
TABLE_A
-------
col_b (pk)
col_c (pk)
[other fields]
-------
TABLE_B
-------
col_a (pk)
col_b (pk) (fk TABLE_A.col_b)
col_c (fk TABLE_A.col_c)
[other fields]
Как я могу справиться с этим с помощью Hibernate?
Я понятия не имею, как объявить внешний ключ, который содержал бы часть первичного ключа.
Моя схема базы данных создается из модели Hibernate.
2 ответов:
Я нашел два решения этой проблемы.
Первый из них является скорее обходным путем и не так аккуратен, как второй.Определите первичный ключ сущности
Bкак составной ключ, содержащийcol_a,col_b, иcol_cи то, что должно было быть первичным ключом в первую очередь, определите как уникальное ограничение. Недостатком является то, что столбецcol_cна самом деле концептуально не является частью первичного ключа.@Entity class A { @Id private int b; @Id private int c; } @Entity @Table(uniqueConstraints = {@UniqueConstraint(columnNames = { "a", "b" }) }) class B { @Id private int a; @Id @ManyToOne(optional = false) @JoinColumns(value = { @JoinColumn(name = "b", referencedColumnName = "b"), @JoinColumn(name = "c", referencedColumnName = "c") }) private A entityA; }Второй использует
@EmbeddedIdи@MapsIdаннотации и делает именно то, что я хотел сделать в самом начале.@Entity class A { @Id private int b; @Id private int c; } @Embeddable class BKey { private int a; private int b; } @Entity class B { @EmbeddedId private BKey primaryKey; @MapsId("b") @ManyToOne(optional = false) @JoinColumns(value = { @JoinColumn(name = "b", referencedColumnName = "b"), @JoinColumn(name = "c", referencedColumnName = "c") }) private A entityA; }
Второе решение Джаггера, которое является моей первой реакцией, с @EmbededId и @MapsId. Ниже приведен другой способ, основанный на его втором решении, но без использования @MapsId. '
@Entity class A { @Id private int b; @Id private int c; } @Embeddable class BKey { private int a; private int b; } @Entity class B { @EmbeddedId private BKey primaryKey; @ManyToOne(optional = false) @JoinColumns(value = { @JoinColumn(name = "b", referencedColumnName = "b", insertable= false, updatable= false), @JoinColumn(name = "c", referencedColumnName = "c") }, ) private A entityA; }
Comments