Java 如何在Hibernate中通过具有不同名称的非PK列映射2个表

Java 如何在Hibernate中通过具有不同名称的非PK列映射2个表,java,hibernate,Java,Hibernate,我有两个表,它们可能通过非PK辅助列相互关联。此外,此匹配的列名在每个表中都是不同的。就是 @Entity @Table(name = "PLANS_T") public class Plans { private Integer id; // PK //... private String secondaryIdentifier; // Should be matched with TRAINEES.auxiliaryIdentifier /

我有两个表,它们可能通过非PK辅助列相互关联。此外,此匹配的列名在每个表中都是不同的。就是

@Entity
@Table(name = "PLANS_T")
public class Plans {
    private Integer id; // PK
    //...
    private String secondaryIdentifier; // Should be matched with TRAINEES.auxiliaryIdentifier
    //...
}

@Entity
@Table(name = "TRAINEES_T")
public class Trainee {    
    private Integer id; // PK
    //...
    private String auxiliaryIdentifier; // Should be matched with PLANS.secondaryIdentifier
}
计划
学员
之间的关系是多对一的:您可以为一名学员制定多个计划

我需要对它们进行适当的注释,以表明
PLANS\u T.secondaryIdentifier
应与
Tradients\u T.auxiliaryIdentifier
一起用于
JOIN
s(例如在Criteria API中,它需要从一个表到另一个表的连接路径)

但是我不能用这个

@实体
班级学员{
@OneToMany(mappedBy=“计划”)
私人收集计划=新建ArrayList();
}
@实体
课堂计划{
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“auxiliary_identifier”)//我在哪里指定“secondaryIdentifier”,一个非PK列?
私人见习生;
}

我需要一种方法来指定注释中的两个非PK列。使用Criteria API时,这些注释提供了创建连接路径的路径。

您应该按照以下方式更正映射:

@实体
班级学员{
@OneToMany(mappedBy=“培训生”)
私有列表计划=新建ArrayList();
}
@实体
课堂计划{
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“次要_标识符”,referencedColumnName=“辅助_标识符”)
私人见习生;
}
  • @OneToMany
    mappedBy
    是拥有关系的字段的名称。这是
    计划
    实体的
    培训生
    字段

  • @JoinColumn
    referencedColumnName
    是此外键列引用的列的名称


  • 谢谢,事实正好相反:在
    计划中,它应该是
    @JoinColumn(name=“secondary\u identifier”,referencedColumnName=“auxiliary\u identifier”
    。换句话说,
    @JoinColumn
    是这个表的列。否则,它工作得很好,谢谢!您可能需要更新答案。
    @Entity
    class Trainee {
    
        @OneToMany(mappedBy = "plan")
        private Collection<Plans> plans = new ArrayList<Plans>();
    
    }
    
    @Entity
    class Plans {
    
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name="auxiliary_identifier") // Where do I specify "secondaryIdentifier", a non-PK column?
        private Trainee trainee;
    
    }