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