【问题标题】:What is the correct CascadeType in @ManyToMany Hibernate annotation?@ManyToMany Hibernate 注释中正确的 CascadeType 是什么?
【发布时间】:2015-08-08 21:08:14
【问题描述】:

我正在尝试在 Hibernate 中对瞬态操作解决方案架构进行建模,但我不确定如何从模型中获取我想要的对象图和行为。

表结构使用关联表(多对多)为操作创建用户列表:

Operation     OperationUsers      Users
op_id         op_id               user_id
...           user_id             ...

在使用 hibernate 注释对持久类 Operation.java 建模时,我创建了:

@ManyToMany(fetch=FetchType.LAZY)
@JoinColumn(name="op_id")
public List<User> users() { return userlist; }

到目前为止,我有以下问题:

  1. 从列表中删除用户时,如何避免休眠
    从用户表中删除用户?它应该被删除
    来自相关表,而不是用户表。我看不到有效的 CascadeType 来完成这个。
  2. 我需要在方法主体中添加更多内容吗?
  3. 是否需要添加更多注释参数?
  4. 我希望这样做 不会对 User 类造成影响。 请告诉我,我不必乱用 User.java!

这可能是我想多了,但这就是学习的本质...提前感谢您提供的任何帮助!

【问题讨论】:

    标签: java hibernate annotations many-to-many cascade


    【解决方案1】:

    来自文档:

    Hibernate 定义并支持以下对象状态:

    *Transient - 如果一个对象刚刚使用 new 运算符实例化,并且它与 Hibernate Session 无关,则它是瞬态的。它在数据库中没有持久表示,也没有分配标识符值。如果应用程序不再持有引用,垃圾收集器将销毁瞬态实例。使用 Hibernate Session 使对象持久化(并让 Hibernate 处理此转换需要执行的 SQL 语句)。

    *Persistent - 持久实例在数据库中具有表示形式和标识符值。它可能刚刚被保存或加载,但是,根据定义,它在 Session 的范围内。 Hibernate 将检测对处于持久状态的对象所做的任何更改,并在工作单元完成时将状态与数据库同步。开发人员不执行手动 UPDATE 语句,或在对象应为瞬态时执行 DELETE 语句。

    *Detached - 一个分离的实例是一个已经持久化的对象,但它的 Session 已经关闭。当然,对对象的引用仍然有效,分离的实例甚至可能在这种状态下被修改。一个分离的实例可以在稍后的时间点重新附加到一个新的 Session 上,使其(以及所有修改)再次持久化。此功能为需要用户思考时间的长时间运行的工作单元启用了编程模型。我们称它们为应用程序事务,即从用户的角度来看的一个工作单元。

    this answer 中所述,您可以使用 Session.evict() 分离实体,以防止休眠更新数据库或简单地克隆它并在副本上进行所需的更改。

    【讨论】:

    • 当我说operation.addUser(aUser) 我希望Hibernate 执行insert into correlation_table values (op_id, user_id),当我说operation.removeUser(aUser) 我希望Hibernate 执行delete from correlation_table where op_id = ? and user_id = ?。我要避免的是delete from user where user_id = ?
    【解决方案2】:

    事实证明,我的主要问题(#1 和主要主题)的具体答案是:“不要在属性上指定任何 CascadeType。”

    the answer to this question 中提到了答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-15
      • 1970-01-01
      • 2015-01-08
      • 2011-10-12
      • 1970-01-01
      • 2012-11-30
      • 2011-01-22
      • 1970-01-01
      相关资源
      最近更新 更多