Java @ManyToMany Hibernate注释中正确的级联类型是什么?

Java @ManyToMany Hibernate注释中正确的级联类型是什么?,java,hibernate,annotations,many-to-many,cascade,Java,Hibernate,Annotations,Many To Many,Cascade,我正在尝试在Hibernate中对一个瞬态操作解决方案模式进行建模,但我不确定如何从模型中获取所需的对象图和行为 表结构使用关联表(多对多)为操作创建用户列表: Operation OperationUsers Users op_id op_id user_id ... user_id ... 在使用hibernate注释对persistent class Operation.java进行

我正在尝试在Hibernate中对一个瞬态操作解决方案模式进行建模,但我不确定如何从模型中获取所需的对象图和行为

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

Operation     OperationUsers      Users
op_id         op_id               user_id
...           user_id             ...
在使用hibernate注释对persistent class Operation.java进行建模时,我创建了:

@ManyToMany(fetch=FetchType.LAZY)
@JoinColumn(name="op_id")
public List<User> users() { return userlist; }
@ManyToMany(fetch=FetchType.LAZY)
@JoinColumn(name=“op_id”)
公共列表用户(){return userlist;}
到目前为止,我有以下问题:

  • 从列表中删除用户时,如何避免休眠
    是否从用户表中删除用户?只需将其删除
    从关联表,而不是用户表。我看不到有效的文件 级联类型来实现这一点
  • 我是否需要在方法体中添加更多内容
  • 是否需要添加更多注释参数
  • 我希望在不使用用户类的情况下做到这一点。 请告诉我,我不必搞乱User.java
    可能我想得太多了,但这是学习的本质。。。提前感谢您提供的任何帮助

    来自文档:

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

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

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

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


    如中所述,您可以使用Session.execute()分离实体,以防止hibernate更新数据库,或者简单地克隆数据库并对副本进行必要的更改。

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


    答案在。

    当我说
    operation.addUser(aUser)
    时,我希望Hibernate执行
    insert-into-correlation\u-table值(op\u-id,user\u-id)
    ,当我说
    operation.removeUser(aUser)
    时,我希望Hibernate执行
    delete-from-correlation\u-table,其中op\u-id=?用户id=?
    。我要避免的是
    从user\u id=?
    的用户中删除。