Java Hibernate JPA can';t referenceColumn a@joinColumn在other@实体中

Java 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

@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之间的关系