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

时间:2020-06-21 13:18:25

标签: java hibernate

我有2个表,这些表可能通过非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
}

PLANSTRAINEE之间的关系是多对一的:您可以为实习生制定许多计划。

我需要正确注释这些内容,以指示PLANS_T.secondaryIdentifierTRAINEES_T.auxiliaryIdentifier一起使用JOIN(例如在Criteria API中,需要从一个表到一个表的联接路径)另一个)。

但是我不能使用typical examples例如

@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;

}

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

1 个答案:

答案 0 :(得分:2)

您应通过以下方式更正映射:

@Entity
class Trainee {

   @OneToMany(mappedBy = "trainee")
   private List<Plans> plans = new ArrayList<Plans>();
}

@Entity
class Plans {

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name="secondary_identifier", referencedColumnName = "auxiliary_identifier")
   private Trainee trainee;

}
  1. mappedBy的{​​{1}}是拥有关系的字段的名称。这是@OneToMany实体的trainee字段。

  2. Plans的{​​{1}}是此外键列引用的列的名称。