JPA EclipseLink:持久分离实体不会引发任何错误
JPA EclipseLink: Persisting detached entity does not throw any error
我正在学习 JPA 实体生命周期,我想了解 'Detached' 实体。下面是我的代码,
//Creating a new employee with id and name field
Employee e = new Employee("1001","Sasi");
em.getTransaction().begin();
em.persist(e);
em.getTransaction().commit();
//Detaching Employee from Persistence context
em.detach(e);
//Persisting detached entity
em.getTransaction().begin();
e.setEmployeeId("1002");
em.persist(e);
em.getTransaction().commit();
我看到的是,mysql 数据库中插入了两行,而不是出现错误。你能告诉我为什么没有抛出错误吗?我确定我误解了分离实体的概念,请帮助我正确理解它。
实体由它们的 ID 标识,而不是由对象实例标识。因此,如果您给实体一个新的 ID(在本例中为“1002”),它就是一个可以无错误地持久化的新实体。您分离了 ID 为“1001”的实体。但这不会影响 ID 为“1002”的实体。
顺便说一句,分离意味着您从上下文中删除了实体,这意味着实体管理器失去了对相应对象实例的控制。所以,例如它不能重新加载延迟声明的 OneToMany refrences/lists、a.s.o。
如果您有一个具有新 ID 的实体,您可以保留它。如果您的实体具有已持久化的 ID,您必须 merge/attache 它,然后您可以持久化附加对象,这意味着您更新持久化实体。
我有一个不清楚的观察,(在网络应用程序中,分离的实体很难调试),也许 Eslipelink 2.6 会在新的 Id 中静默保存现有的分离对象两次(通过 em.persist() )。没有例外,没有,沉默。给我一个惊喜。
当我改成 update() +persist() 就OK了。
我正在学习 JPA 实体生命周期,我想了解 'Detached' 实体。下面是我的代码,
//Creating a new employee with id and name field
Employee e = new Employee("1001","Sasi");
em.getTransaction().begin();
em.persist(e);
em.getTransaction().commit();
//Detaching Employee from Persistence context
em.detach(e);
//Persisting detached entity
em.getTransaction().begin();
e.setEmployeeId("1002");
em.persist(e);
em.getTransaction().commit();
我看到的是,mysql 数据库中插入了两行,而不是出现错误。你能告诉我为什么没有抛出错误吗?我确定我误解了分离实体的概念,请帮助我正确理解它。
实体由它们的 ID 标识,而不是由对象实例标识。因此,如果您给实体一个新的 ID(在本例中为“1002”),它就是一个可以无错误地持久化的新实体。您分离了 ID 为“1001”的实体。但这不会影响 ID 为“1002”的实体。
顺便说一句,分离意味着您从上下文中删除了实体,这意味着实体管理器失去了对相应对象实例的控制。所以,例如它不能重新加载延迟声明的 OneToMany refrences/lists、a.s.o。 如果您有一个具有新 ID 的实体,您可以保留它。如果您的实体具有已持久化的 ID,您必须 merge/attache 它,然后您可以持久化附加对象,这意味着您更新持久化实体。
我有一个不清楚的观察,(在网络应用程序中,分离的实体很难调试),也许 Eslipelink 2.6 会在新的 Id 中静默保存现有的分离对象两次(通过 em.persist() )。没有例外,没有,沉默。给我一个惊喜。
当我改成 update() +persist() 就OK了。