活动Session中是否有引用 oid是否有效
transient 否 无效
detached 否 有效
persistented 是 有效
我是这样理解hibernate三状态的,没有时间读代码,恳请大家指正,欢迎拍砖。
[b]问题补充:[/b]
呵呵,不赞同你的观点。
Entity状态是hibernate的核心,还是应该搞清楚些比较好。
不过还是要感谢你。
Entity的状态是hibernate的代理的核心而已,不见得是hibernate整个体系的核心。
我教你一个办法,你用内存跟踪的办法看一下每种状态下,尤其是后两种对象在内存中的存在形式,设个断点就能清楚看到,其实没啥花样的,一个CGLIB增强对象而已,然后在操作一些方法时,方法被代理了,然后会根据情况决定是否调用session,如果session开着就是你说的persistented,如果session关了,就是detached。
至于transient普通对象而已,如果id是signed的话,也有可能有id,或者用于其他用途的话,也可以有id的。
我举个例子:
[code="java"]
Group group = new Group();
group.setGroupId(groupId);//这个groupId作为参数传入
Student student = new Student();
student.setName("张三");
student.setGroup(group);//你说这个时候group算哪种呢?呵呵,不要拘泥于教材上的三种状态。
entityDao.save(student);
[/code]
detached的对象在二级缓存中可能还有引用,还有detached对象本来就是针对sesson关闭以后的情况。
光理解这三种状态没有太大实际意义,建议你根据自己做的crud的例子,来自我分析一下三种状态分别存在于哪些阶段。