一般说来!游离对象与临时对象的区别在于:前者是由持久化对象转变过来的,因此可能在数据库中还存在对应的记录,而后者在数据库中没有对应的记录。
问题:
当一个对象(有oid)通过方法调用传过来我怎么知道这个对象是游离对象还是临时对象,怎么知道他是否由持久化对象转变而来,怎么知道数据库有没有记录(不可能去查一遍,查的话状态就变成另一种了),谢谢大家!
其实仔细辨别应该是hibernate内部的事情,个人觉得hibernate内部应该有几个Map分别保留各种状态的对象,当然,这部分实现是要看hibernate源码的。
通常的区分方式应该是看对象里有没有oid,游离状态的对象是一定有oid的,但是初始状态的对象(你说的临时对象)有可能没有oid,因为这个oid可能是有数据库或是别的方式产生的。
关键还是看你的目的,为什么要区分这两种状态,区分的目的是什么?
[quote]问题:一个对象有oid,而且这个oid是在数据库中存在的id,这个对象怎么判断游离还是临时? [/quote]
说初始状态应该是这个对象在还没有插入到数据库时的对象,即使对象有oid,这个oid也是程序产生的,和数据库无关,数据库也没有这条记录。所以,你说对象的oid在数据库已经存在,我认为这个对象的状态就是游离状态。
[quote]但是想确认下是不是这样?有没有说法? [/quote]
我没有研究过hibernate的源码,但是很多其它工具的源码都是类似的实现方式,我没法给明确的说法。
[quote]目的:一个游离对象可以update ,一个临时对象update的话就要有oid,但是如果有的字段没有值的话,数据库会设置为null。 [/quote]
好像都直接操作对象就行了,没有区分的必要。
[code="java"] User user = new User();
user.setId(12);// id: 12 是数据库有的
user属于游离状态?[/code]
游离状态的对象是hibernate维护的,前面已经说明,你自己生成的对象没有被hibernate维护,就不是游离状态的对象。