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.

879   2  

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

    Ничего не найдено.