我在Spring中使用JPA并拥有2个实体:
public class DocumentType {
@Id
@GeneratedValue
private Long id;
private String name;
private String idPrefix;
private Integer maxNumberOfSuffixDigits;
private Long startingSuffixNumber;
private String nextDocId;
...
}
public class Document {
@Id
private String id;
@ManyToOne
@JoinColumn
private DocumentType documentType;
...
}
许多文档可以映射到同一个DocumentType,并且可以有许多DocumentTypes。文档的id将使用其中对应的DocumentType中的参数组合生成,其中:idPrefix + startingSuffixNumber前缀为0以满足maxNumberOfSuffixDigits约束。目前,我是否会存储预先生成的nextDocId,但出于此问题的目的(如果它使解决方案更容易),请假设它可用。
我遇到的问题是获取nextDocId,并在并发环境中生成以下Id。我已经研究了悲观的写锁,但我不认为这可以解决这个问题,因为从我所看到的,它只能锁定一个查询。我需要一种方法以某种方式锁定两个查询:在nextDocId上选择查询,然后立即进行更新以生成新的nextDocId。
我将非常感谢有关如何实现这一目标或其他替代方案的任何建议。