gpt4 book ai didi

java - Play 框架 2.1.x CascadeType.DETACH

转载 作者:行者123 更新时间:2023-12-01 12:35:42 25 4
gpt4 key购买 nike

我已经尝试解决这个问题有一段时间了,但我似乎找不到任何有类似问题的人。

我有一个包含多个 LogEntries 的 Person。当我删除这个人时,我仍然想保持日志条目完整。

在 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

Detached entity objects are objects in a special state in which they are not managed by any EntityManager but still represent objects in the database.

...

...

Marking a reference field with CascadeType.DETACH (or CascadeType.ALL, which includes DETACH) indicates that detach operations should be cascaded automatically to entity objects that are referenced by that field

因此,分离从实体管理器卸载对象。如果您不想从其 logEntries 中分离(删除链接)一个 Person,您必须手动执行此操作。

为此,您可以使用 JPQL Update Query在删除 Person 元素之前。举例来说(警告未测试!!):

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);

注释:

  • 交易代码中使用此代码
  • 更新查询 不会向 JPA 监听器通知更新事件(例如 @PrePersist@PostPersist 带注释的方法)
  • is described here您不应该使用JPA 监听器对entityManager 执行任何操作,因此您不应该在Person 上使用@PreRemove 实体来清除LogEntity关系。

关于java - Play 框架 2.1.x CascadeType.DETACH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25618829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com