我正在尝试在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; }
到目前为止,我有以下问题:
我可能会过度思考这一点,但这就是学习的本质......提前感谢您提供的任何帮助!
答案 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中提到了答案。