@ManyToMany Hibernate注释中的正确CascadeType是什么?

时间:2015-05-27 00:42:48

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

我正在尝试在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. 当用户从列表中删除时,如何避免Hibernate
    从Users表中删除用户?它应该被删除
    来自关联表,而不是Users表。我看不出有效的 CascadeType来实现这一目标。
  2. 我是否需要在方法体中添加更多内容?
  3. 我是否需要添加更多注释参数?
  4. 我希望在没有使用User类的情况下执行此操作。 请告诉我,我不必乱用User.java!
  5. 我可能会过度思考这一点,但这就是学习的本质......提前感谢您提供的任何帮助!

2 个答案:

答案 0 :(得分:0)

来自文档:

  

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

     

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

     

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

     

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

this answer中所述,您可以使用Session.evict()分离您的实体,以防止hibernate更新数据库,或者只是克隆它并在副本上进行必要的更改。

答案 1 :(得分:0)

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

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