Как сопоставить 2 таблицы через столбцы без PK с разными именами в Hibernate - PullRequest
1 голос
/ 21 июня 2020

У меня есть 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
}

Связь между PLANS и TRAINEE - «многие к одному»: у вас может быть много планов для стажера.

Мне нужно правильно аннотировать их чтобы указать, что PLANS_T.secondaryIdentifier следует использовать с TRAINEES_T.auxiliaryIdentifier для JOIN s (например, в API критериев, которому нужен путь соединения от одной таблицы к другой).

Но я не могу используйте типичные примеры например,

@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 эти аннотации предоставляют путь для создания путей соединения.

1 Ответ

2 голосов
/ 21 июня 2020

Вы должны исправить свое сопоставление следующим образом:

@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 из @OneToMany - это имя поля, которому принадлежит связь. Это поле trainee объекта Plans.

  2. referencedColumnName из @JoinColumn - это имя столбца, на который ссылается этот столбец внешнего ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...