我正在尝试在 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(使用前将#替换为@)