模块化应用程序中的JPA/Hibernate一对一级联删除
在多模块应用程序中,我有两个来自两个不同模块的实体类。一个实体在另一个实体上具有单向的一对一关系 主要实体“Song”来自模块Song核心,其定义如下:模块化应用程序中的JPA/Hibernate一对一级联删除,hibernate,jpa,Hibernate,Jpa,在多模块应用程序中,我有两个来自两个不同模块的实体类。一个实体在另一个实体上具有单向的一对一关系 主要实体“Song”来自模块Song核心,其定义如下: @Entity public class Song { @Id(strategy = GenerationType.IDENTITY) private int id; private String name; } 下一个名为“SongLyms”的实体来自模块“song Lyms”,其定义如下: @Entity public
@Entity
public class Song {
@Id(strategy = GenerationType.IDENTITY)
private int id;
private String name;
}
下一个名为“SongLyms”的实体来自模块“song Lyms”,其定义如下:
@Entity
public class SongLyrics {
@Id(strategy = GenerationType.IDENTITY)
private int id;
@OneToOne
private Song song;
@Column(nullable = false, length=1024)
private String lyrics;
}
由于SongLyps实体来自可选的“song Lyps”模块,该模块在最终应用程序中可能可用,也可能不可用,因此它与“song”实体的关系是单向的
现在,我想删除“SongLyms”实体,只要删除“Song”实体。但现在发生的是“歌词”实体被作为“孤儿”留下,只有“歌曲”实体被删除
请给出您对此的见解。谢谢。这些
歌词在一对一的关系中不能有它的身份。一对一意味着它们共享相同的主键。当在数据库中使用普通外键从歌词
指向歌曲
时,这是一种多对一关系
问题是歌曲
与歌词
之间没有关系,因此从hibernate进行级联不起作用
以下是我想到的选项:
- 创建一个从
歌曲
到歌词
的多对任意关系,以解耦类型并仍然能够级联(和导航)
- 在应用程序中使用一种事件来通知模块何时删除某些内容,以允许它们清理(甚至否决)
- 使用数据库触发器删除
歌词
歌词在一对一的关系中不能有一个身份。一对一意味着它们共享相同的主键。当在数据库中使用普通外键从歌词
指向歌曲
时,这是一种多对一关系
问题是歌曲
与歌词
之间没有关系,因此从hibernate进行级联不起作用
以下是我想到的选项:
- 创建一个从
歌曲
到歌词
的多对任意关系,以解耦类型并仍然能够级联(和导航)
- 在应用程序中使用一种事件来通知模块何时删除某些内容,以允许它们清理(甚至否决)
- 使用数据库触发器删除
歌词
小更正:@OneToOne
创建基于foregin键的一对一关系,与
相同。感谢@Stefan和@axtavt的建议。我将更新歌词,以便FK to Song也是主键。但正如@Stefan所强调的,歌曲和歌词之间仍然没有关系,主要是因为它们跨越了模块。这就是为什么hibernate(或任何JPA提供者)不能传播“级联”效应的原因。谢谢Stefan的第二和第三个建议。我一直在考虑使用Spring AOP来处理这个问题,但如果有任何可移植的方法来创建数据库触发器,那也可以。小小的更正:@OneToOne
创建基于foregin键的一对一关系,与
相同。感谢@Stefan和@axtavt的建议。我将更新歌词,以便FK to Song也是主键。但正如@Stefan所强调的,歌曲和歌词之间仍然没有关系,主要是因为它们跨越了模块。这就是为什么hibernate(或任何JPA提供者)不能传播“级联”效应的原因。谢谢Stefan的第二和第三个建议。我在考虑使用SpringAOP来处理这个问题,但如果有任何可移植的方法来创建数据库触发器,那也可以。