我认为根据某些条件,在向表中添加新记录时,我有一个相当简单的手动递增ID的任务。
假设我有表Book和Chapter。章节自动增加了ChapterId,BookId的外键和ChapterNo。每次我在本书中添加章节时,我都希望ChapterNo为本章所属的特定书籍增加1。
可以通过简单的SQL语句来完成:插入章节(BookId,ChapterNo)值(XXX,从BookId = XXX的章节中选择max(ChapterNo)+ 1)。但有没有办法在JPA中做到这一点并避免竞争条件(如果我先阅读max ChapterNo然后再插入,就会发生这种情况)
更新:到目前为止我提出的唯一合理的解决方案:实现DB触发器,负责增加ChapterNo。那么至少我在JPA方面不需要任何原生查询
答案 0 :(得分:1)
也许它不是完整的解决方案,但有@OrderColumn注释的JPA功能。
基本上,您使用List实现@OneToMany关系,JPA将保持列表中元素的顺序在数据库的列中。适用于本书和章节,它将是这样的:
@Entity
public class Book
{
...
@OneToMany(mappedBy="book")
@OrderColumn(name="chapterNo")
private List<Chapter> chapters;
...
}
但请注意,如果列表的某些元素发生更改,这可能会导致订单列的许多更新。例如,如果删除第一章然后保留书籍,则将更新所有其他章节以反映其在列表中的新位置。此外,您无法直接访问chapterNo列以在查询中使用,只能通过列表索引进行隐式访问。