JPA:手动增加,避免竞争条件(MySQL)

时间:2013-05-16 15:57:54

标签: mysql jpa race-condition

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

假设我有表Book和Chapter。章节自动增加了ChapterId,BookId的外键和ChapterNo。每次我在本书中添加章节时,我都希望ChapterNo为本章所属的特定书籍增加1。

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

更新:到目前为止我提出的唯一合理的解决方案:实现DB触发器,负责增加ChapterNo。那么至少我在JPA方面不需要任何原生查询

1 个答案:

答案 0 :(得分:1)

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

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

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

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