Play Framework 2.1.x CascadeType.DETACH

问题描述:

我一直在试图解决这个问题一段时间,但我似乎无法找到任何有类似问题的人。Play Framework 2.1.x CascadeType.DETACH

我有一个人,其中包含多个LogEntries。当我删除该人时,我仍然希望保持日志条目不变。

在Person.java:

@OneToMany(mappedBy = "person", cascade = CascadeType.DETACH) 
private List<LogEntry> logEntries; 

在LogEntry.java:

@ManyToOne(cascade = CascadeType.DETACH) 
@JsonIgnore 
private Person person; 

它甚至有可能做到这一点?我得到一个抱怨错误,抱怨外键,这是可以理解的,因为不再有任何关系。但我想知道它是否有可能?

TL;博士

我想删除的人,但保留日志条目,但得到持久性的错误。

任何帮助表示赞赏。

我认为你是在一个错误:

ObjectDB JPA help

独立的实体对象是在一个特殊的状态对象中,他们 不由任何EntityManager的管理,但在 仍表示对象数据库。

...

...

标记与CascadeType.DETACH(或CascadeType.ALL,其包括DETACH)的参考字段指示分离操作应自动级联到被引用的实体对象通过那场

所以,分离是从实体管理器卸载对象。如果你想deatch(删除链接)一个人从它的登录条目你必须手工。

要做到这一点,您可以使用JPQL Update Query删除之前元素。举例(警告,未经测试!):

Query query = em.createQuery(
    "UPDATE LogEntry log SET log.person = null where log.person = :person"); 
query.setParameter("person", person); 
int updateCount = query.executeUpdate(); 
em.remove(person); 

注意

  • 使用此代码交易代码里面
  • 更新查询不notificate 更新事件JPA听众(如@PrePersist@PostPersist注解的方法)
  • 作为is described here你不应该使用JPA听众对EntityManager的进行任何操作,所以你不应该使用@PreRemove实体清除LogEntity关系。
+0

谢谢!你在各个方面都回答了我的问题,如果可以的话,我会回复你的问题,并会尽我所能确保回来。 – 2014-09-02 09:42:51

+0

不客气;-) – jmvivo 2014-09-02 10:36:14