Java Hibernate如何跟踪来自不同会话的分离和持久对象
据我所知,Hibernate在session.close()之前一直跟踪持久对象。 session.close()之后,持久对象变成分离对象,hibernate不知道这个对象 我在下面的两个代码示例中有一些混淆 在第一个代码示例中:-仅打开一个会话,并在会话后保留一个对象。close()此对象被分离,我们无法执行更新(例如object.setName()) 但在第二个代码示例中,我们将对象分离并对对象执行setter,然后再次打开一个会话并更新这个分离的对象。但是第二个会话如何知道上述setter值或更新Java Hibernate如何跟踪来自不同会话的分离和持久对象,java,hibernate,jakarta-ee,orm,hibernate-mapping,Java,Hibernate,Jakarta Ee,Orm,Hibernate Mapping,据我所知,Hibernate在session.close()之前一直跟踪持久对象。 session.close()之后,持久对象变成分离对象,hibernate不知道这个对象 我在下面的两个代码示例中有一些混淆 在第一个代码示例中:-仅打开一个会话,并在会话后保留一个对象。close()此对象被分离,我们无法执行更新(例如object.setName()) 但在第二个代码示例中,我们将对象分离并对对象执行setter,然后再次打开一个会话并更新这个分离的对象。但是第二个会话如何知道上述sette
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();
}
}
4.可能是我弄错了,请指出我的错误
谢谢:)首先,我建议你读一点关于
- 通过调用
,该会话将获取新的新副本并使用合并实体更新它会话来合并实体。merge(entity)
- 通过调用遗留
会话来附加实体。更新(实体)