gpt4 book ai didi

java - 如何在JPA中定义多对多到自身?

转载 作者:行者123 更新时间:2023-11-30 05:08:47 26 4
gpt4 key购买 nike

我正在尝试在 JPA 中定义此 SQL 架构:

TABLE event (id INT)
TABLE chain (predecessor INT, successor INT)

换句话说,每个事件都有多个后继事件,这些后继事件就是事件本身。我正在尝试在 JPA 中这样做:

@Entity
public class Event {
@Id Integer id;
@ManyToMany(cascade = CascadeType.PERSIST)
@JoinTable(
name = "chain",
joinColumns = @JoinColumn(name = "successor"),
inverseJoinColumns = @JoinColumn(name = "predecessor")
)
private Collection<Event> predecessors;
}

@Entity
public class Chain {
@Id Integer id;
@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "predecessor")
private Event predecessor;
@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "successor")
private Event successor;
}

正确吗?

最佳答案

通常情况下,人们不会既使用 JoinTable 定义 ManyToMany,又单独将连接表定义为其自己的实体。连接表通常不是实体,它们只是连接表,提供者在后台管理它们。当您更改其中之一时,如何正确维护应用程序的内存状态会给自己带来很多麻烦。 (例如,如果您想使用 L2 缓存,这是必需的。)

所以,任何一个都工作得很好,结合起来,它们有点奇怪。通常,如果您将 Chain 定义为实体,那么您将只有事件上的 Chain 列表。也不将其重新定义为 Event 上的 JoinTable。这有道理吗?

(由于它目前是严格定义的,如果您尝试通过事件集合进行更改,除非该 ID 是数据库生成的序列,否则它将中断。)

编辑:类似这样的东西 -

@Entity
public class Event {
@Id Integer id;

@OneToMany(cascade = CascadeType.PERSIST, mappedBy="successor")
private Collection<Chain> predecessorChains;
}

只要您意识到Collection<Event> predecessors,您最初编写的内容就可以发挥作用。本质上是只读的,如果您尝试对其进行 L2 缓存,则会受到干扰。事实上,您输入了 CascadeType它使您希望能够向其添加事件或从中删除事件,当 hibernate 尝试执行非法 SQL 时,它会爆炸。

关于java - 如何在JPA中定义多对多到自身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4207935/

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