我正在尝试在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。”
答案在这个问题的答案中被提到了。
从留档:
Hibernate定义并支持以下对象状态:
*瞬态-如果一个对象刚刚使用new运算符实例化,并且它没有与Hibernate Session相关联,则它是瞬态的。它在数据库中没有持久表示,也没有分配标识符值。如果应用程序不再持有引用,瞬态实例将被垃圾收集器销毁。使用Hibernate Session使对象持久化(并让Hibernate负责此转换需要执行的SQL语句)。
*持久-持久实例在数据库中有一个表示和一个标识符值。它可能刚刚被保存或加载,但是,根据定义,它在Session的范围内。Hibernate将检测对处于持久状态的对象所做的任何更改,并在工作单元完成时将状态与数据库同步。当对象应该瞬态时,开发人员不会执行手动UPDATE语句或DELETE语句。
*分离——分离的实例是一个已经持久化的对象,但它的Session已经关闭。当然,对该对象的引用仍然有效,分离的实例甚至可能在这种状态下被修改。分离的实例可以在稍后的时间点重新附加到一个新的Session,使其(以及所有修改)再次持久化。此功能为需要用户思考时间的长时间运行的工作单元启用了编程模型。我们称之为应用程序事务,即从用户的角度来看的工作单元。
如本答案所述,您可以使用Session. evmit()分离实体以防止hibernate更新数据库或简单地克隆它并对副本进行所需的更改。