外键映射到 Embeddable class
Foreign key mapping to Embeddable class
我正在使用 Hibernate
将实体 1 连接到实体 2,其中实体 2 具有复合主键。
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)
您似乎遇到了与该用户相同的问题:AnnotationException: A Foreign key refering has the wrong number of column. should be 2
Entity1 无法将关系存储在一个列中,因为 Entity2 有一个包含 2 列的 ID。您可以使用 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;
我正在使用 Hibernate
将实体 1 连接到实体 2,其中实体 2 具有复合主键。
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)
您似乎遇到了与该用户相同的问题:AnnotationException: A Foreign key refering has the wrong number of column. should be 2
Entity1 无法将关系存储在一个列中,因为 Entity2 有一个包含 2 列的 ID。您可以使用 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;