1

我认为我有一个相当简单的任务,即在根据某些条件向表中添加新记录时手动递增 ID。

假设我有表书和章。Chapter 具有自动递增的 ChapterId、BookId 的外键和 ChapterNo。每次我向书中添加章节时,我都希望 ChapterNo 为该章节所属的特定书籍增加一。

可以通过简单的 SQL 语句完成:插入章节 (BookId, ChapterNo) 值 (XXX, select max(ChapterNo) + 1 from chapter where BookId = XXX)。但是有没有办法在 JPA 中做到这一点并避免竞争条件(如果我先阅读 max ChapterNo 然后进行插入,就会发生这种情况)

更新:到目前为止我想出的唯一合理的解决方案:实现负责递增 ChapterNo 的 DB 触发器。那么至少我在 JPA 端不需要任何本机查询

4

1 回答 1

1

也许它不是完整的解决方案,但有一个带有@OrderColumn注释的 JPA 功能。

本质上,您使用列表实现@OneToMany 关系,JPA 会将列表中元素的顺序保留在数据库的列中。应用于本书和章节,它将是这样的:

@Entity
public class Book
{
    ...
    @OneToMany(mappedBy="book")
    @OrderColumn(name="chapterNo")
    private List<Chapter> chapters;
    ...
}

但请注意,如果列表的某些元素发生更改,这可能会导致对 order 列的许多更新。例如,如果您删除第一章然后持久化该书,则所有其他章节都将更新以反映它们在列表中的新位置。此外,您无法直接访问 chapterNo 列在查询中使用,只是通过列表索引进行的隐式访问。

于 2013-05-16T22:01:56.950 回答