JPA EclipseLink:持久的分离实体不会抛出任何错误

时间:2015-07-25 07:45:54

标签: jpa eclipselink jpa-2.0 jpa-2.1

我正在学习JPA实体的生命周期,我想了解“分离的”#39;实体。以下是我的代码,

//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数据库而不是出错。你能告诉我为什么不抛出错误吗?我确信我误解了分离实体的概念,并且善意地帮助我正确地理解它。

2 个答案:

答案 0 :(得分:1)

实体由其ID标识,而不是由对象实例标识。因此,如果您为权利提供新的ID(在这种情况下为" 1002"),那么它就是一个可以持久保存而没有错误的新实体。您使用ID" 1001"分离了一个实体。但这不会影响具有ID" 1002"。

的实体

BTW分离意味着您从上下文中删除了实体,这意味着实体管理器失去了对相应对象实例的控制。所以,例如它无法重新加载延迟声明的OneToMany引用/列表,a.s.o。 如果您有一个具有新ID的实体,则可以保留它。如果您的实体具有已经持久化的ID,则必须合并/附加它,然后您可以保留附加的对象,这意味着您更新持久性实体。

答案 1 :(得分:0)

我有一个不明确的观察,(在网络应用程序中,分离的实体很难调试),也许Eslipelink 2.6在新的Id(通过em.persist())默默地保存现有的分离对象两次。没有例外,没有,沉默。给我带来惊喜。

当我更改为update()+ persist()时,一切正常。