Отображение внешнего ключа в класс Embeddable - PullRequest
2 голосов
/ 20 января 2020

Я использую Hibernate для присоединения Entity1 к Entity2, где Entity2 имеет составной первичный ключ.

Entity2 содержит 2 столбца id и type

public class Entity2 {
  @EmbeddedId
  private Entity2PK id;
}
@Embeddable
public class Entity2PK implements Serializable {
  @Column(name = "id")
  private String id;

  @Column(name = "type")
  private String type;
}

Entity1 содержит 2 столбца id и entity_2_id (внешний ключ относится к Entity2)

public class Entity1 {
  @Id
  @Column(name = "id", updatable = false, nullable = false)
  private String id;

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name="entity_2_id")
  private Entity2 entity2;
}

Из-за этого все вызовы не выполняются. У кого-нибудь есть решение для этого?

Сообщение об ошибке:

org.hibernate.AnnotationException: A Foreign key refering Entity2 from Entity1 has the wrong number of column. should be 4
    at org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.java:646)
    at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:102)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processEndOfQueue(InFlightMetadataCollectorImpl.java:1814)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processFkSecondPassesInOrder(InFlightMetadataCollectorImpl.java:1758)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1646)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:286)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83)
    at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:473)
    at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:84)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:689)

1 Ответ

3 голосов
/ 20 января 2020

Похоже, у вас та же проблема, что и у этого пользователя: AnnotationException: при повторном обращении к внешнему ключу указан неправильный номер столбца. должно быть 2

Entity1 не может хранить отношения в одном столбце, поскольку Entity2 имеет идентификатор с 2 столбцами. Вы можете решить эту проблему, используя JoinColumns вместо JoinColumn.

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumns({
  @JoinColumn(name = "entity2_id", insertable = false, updatable = false),
  @JoinColumn(name = "entity2_type", insertable = false, updatable = false)
})
private Entity2 entity2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...