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;博士
我想删除的人,但保留日志条目,但得到持久性的错误。
任何帮助表示赞赏。
答
我认为你是在一个错误:
独立的实体对象是在一个特殊的状态对象中,他们 不由任何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关系。
谢谢!你在各个方面都回答了我的问题,如果可以的话,我会回复你的问题,并会尽我所能确保回来。 – 2014-09-02 09:42:51
不客气;-) – jmvivo 2014-09-02 10:36:14