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

时间:2011-03-28 03:35:24

标签: hibernate jpa

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

主要实体“Song”来自模块歌曲核心,它的定义如下:

@Entity
public class Song {
   @Id(strategy = GenerationType.IDENTITY)
   private int id;
   private String name;
}

下一个名为“SongLyrics”的实体来自模块“歌词”,其定义如下:

@Entity
public class SongLyrics {
  @Id(strategy = GenerationType.IDENTITY)
  private int id;
  @OneToOne
  private Song song;
  @Column(nullable = false, length=1024)
  private String lyrics;
}

由于SongLyrics实体来自可选的“歌词”模块,在最终应用程序中可能会或可能不会,它与“Song”实体的关系是单向的。

现在,每当删除“Song”实体时,我都希望删除“SongLyrics”实体。但现在发生的事情是“SongLyrics”实体被留作“孤儿”,只有“歌曲”实体被删除。

请提供您对此的见解。感谢。

1 个答案:

答案 0 :(得分:3)

SongLyrics不能以一对一的关系拥有一个身份。一对一意味着它们共享相同的主键。当使用数据库中的普通外键指向SongLyricsSong时,它是多对一关系。

问题在于SongSongLyrics之间没有关系,所以从hibernate级联不起作用。

这些是我想到的选择:

  • 创建从SongSongLyrics的多对多关系,以解除类型,并且仍然能够级联(和导航)。
  • 在应用程序中使用某种事件来通知模块何时删除某些内容以允许它们清理(甚至否决)。
  • 使用数据库触发器删除SongLyrics