Java Hibernate JPA can';t referenceColumn a@joinColumn在other@实体中
我有@EntityJava Hibernate JPA can';t referenceColumn a@joinColumn在other@实体中,java,hibernate,jpa,Java,Hibernate,Jpa,我有@Entity @Entity @Table(name = "CO_CONTRACT") public class Contract { @ManyToOne @NotFound(action = NotFoundAction.IGNORE) @JoinColumnsOrFormulas({@JoinColumnOrFormula(column = @JoinColumn(name = "TRAVELDATETYPE", referencedColumnName =
@Entity
@Table(name = "CO_CONTRACT")
public class Contract {
@ManyToOne
@NotFound(action = NotFoundAction.IGNORE)
@JoinColumnsOrFormulas({@JoinColumnOrFormula(column = @JoinColumn(name = "TRAVELDATETYPE", referencedColumnName = "CODEVALUE")),
@JoinColumnOrFormula(formula = @JoinFormula(referencedColumnName = "GD_BUSINESSCODEELEMENT", value = "'TRAVELDATETYPE'"))})
private BusinessElementValue travelDateType;
}
和业务要素价值
@Entity
@Table(name = "GD_BUSINESSCODEELEMENTVAL")
public class BusinessElementValue extends AuditInfo {
@Id
@JoinColumn(name = "GD_BUSINESSCODEELEMENT")
private BusinessElement businessElement;
@Id
@Column(name = "CODEVALUE")
private String codeValue;
}
@Id
@Column(name = "GD_BUSINESSCODEELEMENT")
private String businessElement;
这失败是因为
Unable to find column with logical name: GD_BUSINESSCODEELEMENT in GD_BUSINESSCODEELEMENTVAL
at org.hibernate.cfg.Ejb3JoinColumn.checkReferencedColumnsType(Ejb3JoinColumn.java:858)
at org.hibernate.cfg.BinderHelper.createSyntheticPropertyReference(BinderHelper.java:243)
at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:100)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processEndOfQueue(InFlightMetadataCollectorImpl.java:1752)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processFkSecondPassesInOrder(InFlightMetadataCollectorImpl.java:1696)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1583)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:278)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83)
at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:418)
at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:87)
但如果我在BusinessElementValue中更改它
@Entity
@Table(name = "GD_BUSINESSCODEELEMENTVAL")
public class BusinessElementValue extends AuditInfo {
@Id
@JoinColumn(name = "GD_BUSINESSCODEELEMENT")
private BusinessElement businessElement;
@Id
@Column(name = "CODEVALUE")
private String codeValue;
}
@Id
@Column(name = "GD_BUSINESSCODEELEMENT")
private String businessElement;
那就行了
为什么ot在第一种情况下失败
我可以引用列另一个@Entity中的@JoinColumn列吗?
我做错了什么
多谢各位
@Id
@JoinColumn(name = "GD_BUSINESSCODEELEMENT")
private BusinessElement businessElement;
需要添加referencedColumnName
@Id
@JoinColumn(name = "GD_BUSINESSCODEELEMENT", referencedColumnName="id_in_BusinessElement")
private BusinessElement businessElement;
BusinessElement中应该有一个id列。您需要使用关系规范,如
@OneToOne
:因为是id
@Id
@OneToOne
@Column(name = "GD_BUSINESSCODEELEMENT")
private BusinessElement businessElement;
别忘了在你的测试之前删除你的数据库我终于解决了
您必须使用compisete键创建@embedid,然后它才能工作
@Embeddable
public class BusinessElementValuePK implements Serializable {
@ManyToOne <-- This is very important, if not it doesn't works
@JoinColumn(name = "GD_BUSINESSCODEELEMENT")
private BusinessElement businessElement;
@Column(name = "CODEVALUE")
private String codeValue;
}
@Entity
@Table(name = "GD_BUSINESSCODEELEMENTVAL")
public class BusinessElementValue extends AuditInfo {
@EmbeddedId
private BusinessElementValuePK businessElementValuePK;
}
Contract {
@ManyToOne
@NotFound(action = NotFoundAction.IGNORE)
@JoinColumnsOrFormulas({@JoinColumnOrFormula(column = @JoinColumn(name = "TRAVELDATETYPE", referencedColumnName = "CODEVALUE")),
@JoinColumnOrFormula(formula = @JoinFormula(referencedColumnName = "GD_BUSINESSCODEELEMENT", value = "'TRAVELDATETYPE'"))})
private BusinessElementValue travelDateType;
}
@可嵌入
公共类BusinessElementValuePK实现可序列化{
@非常感谢您的评论,我没有看到字符串值Yes,因为我添加了@OneToOne来指定表与其他表(实体)的id之间的关系