【问题标题】:Foreign key mapping to Embeddable class外键映射到 Embeddable 类
【发布时间】:2020-05-06 07:49:25
【问题描述】:

我正在使用Hibernate 将 Entity1 连接到 Entity2,其中 Entity2 有一个复合主键。

Entity2 包含 2 列 idtype

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 列 identity_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)

【问题讨论】:

  • 为什么通话失败?你能发布一些错误信息吗?您的 Entity2PK 是否也使用 @Embeddable 进行了注释?
  • 已更新错误信息。

标签: java hibernate hibernate-mapping


【解决方案1】:

你似乎和这个用户有同样的问题:AnnotationException: A Foreign key refering has the wrong number of column. should be 2

Entity1 不能将关系存储在单个列中,因为 Entity2 的 id 包含 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;

【讨论】:

  • 应该 Entity1 有 2 列用于引用外键。 ?目前我只有entity_2_id
  • 您应该有 2 列。我更新了我的答案以使其更清楚。
猜你喜欢
  • 2012-04-22
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
  • 2018-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多