2011-05-06 52 views
1

我有三个表:删除集合项目在Hibernate中,无负载实体

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 like(我的想象):

delete user from Group where user.name = :username 

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

我需要它是事务性的。

如果通过HQL无法做到这一点,并且没有在内存中加载对象,那么最好的解决方案是什么?

回答

0

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

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

如果你不能使用HQL,然后使用query.createSQLQuery或任何它是做的本地SQL。

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

这里是相关的link。阅读它,了解它,喜欢它:)

+0

我说我希望它是HQL(不加载内存中的对象)。但是,如果不能编写HQL,那么最好的解决方案是什么? – Zalivaka 2011-05-07 07:37:11

+0

1)我的HQL不起作用。它甚至不符合规范。 2)我不想添加SQL。 3)无状态会话如何帮助我。正如我读过的“集合被无状态会话忽略”。和“它没有实现交易”。我需要它是事务性的。我会将交易要求添加到我的问题帖子中。 – Zalivaka 2011-05-07 07:41:42

+0

我回答了你的问题。在hql中允许删除。它不会延迟加载或级联。无论是交易,我不知道。但你的其他选择是原生SQL。期。 – MJB 2011-05-07 23:15:33

0

你不能写这个查询。如果这是真正的需求,那么您可能需要将连接表提升为完整的实体,以便直接删除它,或者将查询写入本地SQL。

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

+0

我只希望,我可以制作一些魔术= =)我想我会更好地加载组对象,从中删除用户并保存。我只是想节省资源。 – Zalivaka 2011-05-07 07:45:54

1

您的HQL应努力按照您的要求,以及在JPA环境:) Session.createQuery( “......”)。的executeUpdate()

+0

不,它是无效的。它甚至不对应于正则表达式(UPDATE | DELETE)FROM? EntityName(WHERE where_conditions)?. – Zalivaka 2011-05-07 07:30:06

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 
+0

该语法对Hibernate 3.6.10无效 – 2013-02-07 09:16:30