在Hibernate中删除集合中的项目而不加载实体

时间:2011-05-06 16:33:16

标签: java hibernate mapping many-to-many hql

我有三张桌子:

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查询。 Smth喜欢(我的想象力):

delete user from Group where user.name = :username

我无法添加任何数据库或Hibernate级联。

我需要它是交易性的。

如果无法通过HQL进行,并且没有在内存中加载对象,那么最佳解决方案是什么?

4 个答案:

答案 0 :(得分:1)

你的hql应该按照你的要求,以及jpa环境:) Session.createQuery( “......”)。的executeUpdate()

答案 1 :(得分:0)

首先你要求HQL,然后说你不能运行HQL。这是什么。

如果您可以使用HQL,您的基本HQL删除将起作用。它永远不会级联(这可能是一个问题),永远不会加载等。请参阅hibernate doc中的“批量更新操作”以获取更多信息。

如果你不能使用HQL,那么使用query.createSQLQuery或其他任何东西来做本机SQL。

最后,第三个选项是使用StatelessSession - 这也在hibernate doc中讨论过。

以下是相关的link。阅读,理解,喜欢它:)。

答案 2 :(得分:0)

您无法编写该查询。如果这是一个真正的要求,您可能需要将连接表提升为完整的实体,以便您可以直接删除它,或者在本机SQL中编写查询。

另一种选择可能是将您的用户映射为MAP并使用延迟加载来避免加载多余的用户。

答案 3 :(得分:0)

是的,这可以通过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