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

2024-02-06

我正在尝试在 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 时,这将爆炸。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在JPA中定义多对多到自身? 的相关文章

随机推荐