2011-03-28 34 views
0

我在多模块应用程序中有两个不同模块的两个实体类。一个实体在另一个实体之间具有单向一对一关系。在模块化应用程序中JPA /休眠一对一级联删除

主要实体“宋”是从一个模块歌核心,它的定义是这样的:

@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实体和可选的“歌曲的歌词”模块,这可能会或可能不会在最终应用是可用的,它与关系“宋”实体是单向的。

现在我想要删除“SongLyrics”实体,只要删除“Song”实体。但现在发生的情况是,“歌词”实体被留作“孤儿”,只有“歌曲”实体被删除。

请给出你的见解。谢谢。

回答

3

SongLyrics在一对一关系中不能拥有一个身份。一对一意味着他们共享相同的主键。在数据库中使用常规外键指定从SongLyricsSong时,它是多对一的关系。

问题是从SongSongLyrics没有关系,所以从hibernate级联不起作用。

这些都是未来在我脑海中的选项:

  • 创建多到任何从SongSongLyrics关系脱钩的类型,仍然能够级联(和浏览)。
  • 在应用程序中使用一种事件来通知模块什么时候被删除以允许它们清理(甚至否决)。
  • 使用数据库触发器删除SongLyrics
+0

小修正:'@ OneToOne'创建一个基于一对一关系的外键,就像''一样。 – axtavt 2011-03-28 09:00:22

+0

感谢@Stefan和@axtavt的建议。 我会更新SongLyrics,以便FK to Song也是主键。 但正如@Stefan强调的那样,歌曲与SongLyrics之间仍然没有任何关系,主要是因为它们跨越了各个模块。这就是为什么hibernate(或任何JPA提供者)不能传播“级联”效应的原因。 感谢Stefan对第二和第三个建议。我正在思考如何使用Spring AOP来处理这个问题,但是如果有任何可移植的方法来创建数据库触发器,那也可以。 – 2011-03-29 03:34:45