Hibernate ограничения таблицы соединений - PullRequest
2 голосов
/ 09 декабря 2011

У меня есть следующие таблицы:

[таблица: столбец1, столбец2]

A: идентификатор, имя

B: идентификатор, имя

AB: idA, idB

AB является таблицей соединений.

Тогда у меня есть этот метод в спящем классе B

@OneToMany( fetch = FetchType.EAGER)
@JoinTable( name = "AB", 
            joinColumns = @JoinColumn( name = "idB"),
            inverseJoinColumns = @JoinColumn( name = "idA") )
public List<A> getAs(){
    //return the list of matching stuff
}

Это прекрасно работает.

Теперь я хочу сделать этот SQL-запрос в спящем режиме:

select * from B inner join AB on B.id = AB.idB where AB.idA = 1234

По сути, «перечислите мне все B, которые ссылаются на A с идентификатором 1234»

Я мог бы сделать прямой SQL, нобудет побеждать цель getAs ()

Можно ли построить условие Criterion / Restriction для достижения этого?

1 Ответ

1 голос
/ 09 декабря 2011

Отношение между A и B в этом случае не один ко многим, а скорее ко многим. Вы должны отобразить это так:

@ManyToMany
@JoinTable(name = "AB", 
            joinColumns = @JoinColumn( name = "idB"),
            inverseJoinColumns = @JoinColumn( name = "idA") )
public List<A> getAs(){
    //return the list of matching stuff
}

Обратите внимание, что в большинстве случаев активное получение коллекции не очень хорошая идея, поэтому fetch = FetchType.EAGER удалено выше. Теперь вы можете сделать то же самое на стороне A, чтобы сделать отношения двунаправленными:

@ManyToMany(mappedBy='As')
public List<B> getBs(){
    //return the list of matching stuff
}

Теперь получить все B с для данного A - это всего лишь вопрос вызова getBs() для этого A экземпляра. Вы можете создать критерии / написать HQL, чтобы сделать это также - с любой стороны.

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