Hibernate: сопоставление «многие к одному» в отношениях «n: m» - PullRequest
0 голосов
/ 31 января 2012

У меня есть две таблицы, которые находятся в отношении 1: n:

musician
{
id;
...
musician_status_id;
...
}

musician_status{
id;
name;
...
}

Они отображаются в Hibernate:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "musician_status_id", nullable = false)
public MusicianStatus getMusicianStatus() {
   return this.musicianStatus;
}

Теперь моя модель БД меняется на n: m.

musician
{
id;
...
...
}

musician_has_status{
musician_id;
status_id;
organisation_id;
...
}

musician_status{
id;
name;
...
}

У меня много запросов и кода, которые ретранслируют старое отображение. Поэтому я хочу, чтобы получатель Hibernate возвращал только один musician_status в зависимости от organisation_id. Мой идентификатор_организации хранится в статической переменной (данные для входа).

Я думал о представлении и перехватчике, чтобы получить только musician_status для определенного значения organisation_id. Я действительно не знаю, как этого добиться в Hibernate ...

Спасибо заранее.

Добавлено: Новое отображение БД будет выглядеть так:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "musician")
public Set<MusikerHasMusikerStat> getMusicianHasMusicianStatus() {
  return this.musikerHasMusicianStatus;
}

Я хочу изменить это на что-то подобное:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "musician")
@Add a Filter or something like that?: where musician_has_status.organisation_id=LoginDat.getOrganisationID()
public MusicianStatus getMusicianStatus() {
  //or select the right status here?
  return this.musicianStatus;
}

Ответы [ 2 ]

0 голосов
/ 31 января 2012

Идентификаторы предлагают вам использовать предложение @Where( clause = "MYCONDITION" ), так как оно будет фильтровать данные на уровне запросов, что даст вам гораздо лучшую производительность.

0 голосов
/ 31 января 2012

Отобразите это, как оно есть в базе данных, и измените код метода getMusicianStatus:

@OneToMany(...)
@JoinColumn(...)
public void getStatusesWithOrganization() {
    return this.statusesWithOrganization();
}

/**
 * Returns the musician status for the organization stored in 
 * the static login data
 */ 
public public MusicianStatus getMusicianStatus() {
    for (StatusWithOrganization s : statusesWithOrganization) {
        if (LoginData.organizationId.equals(s.getOrganization().getId())) {
            return s.getMusicianStatus();
        }
    }
    return null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...