我知道Hibernate跟踪持久对象直到session.close()。 在session.close()之后,持久对象成为分离对象,而hibernate对此对象并不了解。
我在下面的两个代码示例中有一些困惑。
第一个代码示例中的: - 只打开一个会话并在session.close()之后保留一个对象,此对象将被分离,我们无法执行更新(例如object.setName())。
但在第二个代码示例中,我们使对象分离并在对象上执行setter并再次打开会话并更新此分离的对象。但是第二次会话如何知道上面的设定值或更新..
package objectState;
import org.hibernate.Session;
import org.hibernate.Transaction;
import HibernateUtils.HibernateUtils;
public class ObjectStateTest {
public static void main(String[] args)
{
UserDetails user = new UserDetails(); // Transient Object
user.setUserName("Test User");
Session session = HibernateUtils.getFactory().openSession();
Transaction tx = session.beginTransaction();
session.save(user); //Persistent Object
user.setUserName("updated user"); //HB Keep Track Persistent Object & Perform Update if any change
tx.commit();
session.close();
user.setUserName("update after session closed"); // Detached Object (HB keep track Object until session.close() )
}
}
DetachedToPersistent.java
package objectState;
import org.hibernate.Session;
import org.hibernate.Transaction;
import HibernateUtils.HibernateUtils;
public class DetachedToPersistent {
public static void main(String[] args) {
UserDetails user = new UserDetails(); //Transient Object
user.setUserName("Test User");
Session session = HibernateUtils.getFactory().openSession();
Transaction tx = session.beginTransaction();
session.save(user); //Persistent Object
tx.commit();
session.close();
user.setUserName("update Detached User"); //Detached Object
session = HibernateUtils.getFactory().openSession();
tx = session.beginTransaction();
session.update(user); // Persistent Detached Object
tx.commit();
session.close();
}
}
可能是我犯了一些错误理解请指出我的错误..
谢谢:)
答案 0 :(得分:2)
首先,我建议你阅读一下entity state transitions。
附加对象后,持久性上下文会使用automatic dirty checking mechanism检测更改。
当对象分离时(因为加载它的Session已关闭),您可以:
session.merge(entity)
合并实体,获取新的新副本并使用合并实体对其进行更新。session.update(entity)
merge method is preferred to update,请尽可能使用合并。