【问题标题】:Delete item from collection in Hibernate without loading entities从 Hibernate 中的集合中删除项目而不加载实体
【发布时间】:2011-08-20 08:06:02
【问题描述】:

我有三张桌子:

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 实现并且不将对象加载到内存中,那么最好的解决方案是什么?

【问题讨论】:

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


    【解决方案1】:

    您的 hql 应该按照您的要求工作,以及在 jpa 环境中 :) Session.createQuery("....").executeUpdate()

    【讨论】:

    • 不,它无效。它甚至不对应于正则表达式(UPDATE | DELETE)FROM? EntityName (WHERE where_conditions)?。
    【解决方案2】:

    呃,你首先要求 HQL,然后说你不能运行 HQL。是哪个。

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

    如果您不能使用 HQL,请使用 query.createSQLQuery 或其他任何方法来执行本机 SQL。

    最后,第三种选择是使用 StatelessSession - 在 hibernate 文档中也有讨论。

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

    【讨论】:

    • 我说我希望它是 HQL(不在内存中加载对象)。但是如果不能写HQL,最好的解决方案是什么?
    • 1) 我的 HQL 不起作用。它甚至不符合规范。 2) 我不想添加 SQL。 3)无状态会话如何帮助我。正如我所读到的“集合被无状态会话忽略”。和“它没有实现事务”。我需要它是事务性的。我将在我的问题帖子中添加交易要求。
    • 我回答了你的问题。在 hql 中允许删除。它不会延迟加载或级联。是不是事务性的,我不知道。但是您的另一个选择是本机 SQL。期间。
    【解决方案3】:

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

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

    【讨论】:

    • 我只是希望,我可以做一些魔术 =) 我想我会更好地加载组对象,从中删除用户并保存回来。我只是想节省资源。
    【解决方案4】:

    是的,这可以通过 HQL 实现,不,它不需要将组加载到内存中。

    如果你想从一个组中删除一个用户,下面的 HQL 应该非常接近:

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

    或者,如果您尝试从所有组中删除用户,只需删除 where 的第二部分:

    delete g.users from Group g where g.users.name = :username
    

    【讨论】:

    • Hibernate 3.6.10 的语法无效
    猜你喜欢
    • 2021-02-15
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多