Удалить элемент из коллекции в Hibernate без загрузки объектов - PullRequest
1 голос
/ 06 мая 2011

У меня есть три таблицы:

user(id, name), 
group(id, name), 
xref_user_group(user_id, group_id)

У меня есть два java-класса:

User {
    int id;
    String name;
}

Group {
    int id;
    String name;
    Set<User> users;
}

Можно ли удалить пользователя из группы (и не удалять пользователя) без загрузки объекта группы в память,Мне нужен какой-то HQL-запрос.Что-то вроде (мое воображение):

delete user from Group where user.name = :username

Я не могу добавить базу данных или каскады Hibernate.

Мне нужно, чтобы он был транзакционным.

Если это невозможно сделать через HQL и без загрузки объектов в память, что является лучшим решением?

Ответы [ 4 ]

1 голос
/ 06 мая 2011

ваш hql должен работать как ваше требование, а также в среде jpa :) Session.createQuery ( "...."). ExecuteUpdate ()

0 голосов
/ 26 мая 2011

Да, это возможно с HQL, и нет, это не потребует загрузки групп в память.

Если вы хотите удалить одного пользователя из одной группы, следующий HQL должен быть довольно близко:

delete g.users from Group g where g.users.name = :username and g.id = :groupId

Альтернативно, если вы пытаетесь удалить пользователя из всех групп, просто отбросьте вторую часть где:

delete g.users from Group g where g.users.name = :username
0 голосов
/ 06 мая 2011

Вы не можете написать этот запрос.Если это реальное требование, вам, вероятно, потребуется либо сделать вашу объединяющую таблицу полноценной сущностью, чтобы вы могли удалить ее напрямую, либо написать запрос на собственном SQL.

Другой альтернативой может бытьсопоставьте своих пользователей как MAP и используйте чрезмерно ленивую загрузку, чтобы избежать загрузки лишних пользователей.

0 голосов
/ 06 мая 2011

Сначала вы запрашиваете HQL, а затем говорите, что не можете запустить HQL. Что это такое?

Если вы можете использовать HQL, ваше основное удаление HQL будет работать. Он никогда не каскадируется (что может быть проблемой), никогда не загружается и т. Д. Для получения дополнительной информации см. «Операции массового обновления» в документе hibernate.

Если вы не можете использовать HQL, тогда используйте query.createSQLQuery или что-то еще, чтобы сделать собственный SQL.

Наконец, третий вариант - использовать StatelessSession - это также обсуждается в hibernate doc.

Вот соответствующая ссылка . Прочитайте это, поймите это, любите это:)

...