Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
模块化应用程序中的JPA/Hibernate一对一级联删除_Hibernate_Jpa - Fatal编程技术网

模块化应用程序中的JPA/Hibernate一对一级联删除

模块化应用程序中的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

在多模块应用程序中,我有两个来自两个不同模块的实体类。一个实体在另一个实体上具有单向的一对一关系

主要实体“Song”来自模块Song核心,其定义如下:

@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来处理这个问题,但如果有任何可移植的方法来创建数据库触发器,那也可以。