锁定存储库以仅编写一个进程

时间:2018-11-15 12:32:09

标签: hibernate spring-boot jpa

当我尝试通过swagger保存时,会出现以下错误:

INTERNAL_SERVER_ERROR(PERSISTENCE_DATAACCESS_EXCEPTION) - DataIntegrityViolationException : could not execute statement; SQL [n/a]; constraint [UK_8q03as5by8j5kvtroc1dyl0lo]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute

我的课是这样:

public class Book{
    @Id
    private long id;

    @NotNull
    @Column(unique = true)
    @Size(min = 7, max = 7)

    private String referenceCode;;//this field makes the error because of not unique value creation

referenceCode也是唯一的。我将值保留在另一个表中。并且它还有另一个服务来保存和增加:

 @Override
    public String generateReference(String productCode) {

        ReferenceGenerator referenceGenerator = referenceGeneratorRepository.findByMnemonic(productCode);

        if (referenceGenerator != null) {
            referenceGenerator.setValue(incrementReference(referenceGenerator.getValue()));
            referenceGeneratorRepository.save(referenceGenerator);
        }
        else {
            referenceGenerator = referenceGeneratorRepository.save(new ReferenceGenerator(PREAPP, START_VALUE_FOR_REFERENCE_CODE));
        }

        return PREFIX_OF_REFERENCE_CODE + referenceGenerator.getValue();
    }

    private String incrementReference(String value) {

        return Long.toString( Long.parseLong(value, 36) + 1, 36).toUpperCase();
    }
}

在我的主要服务中,保存时,它使用以下方法:

    public class Bookservice{    

public void createBook(){
book.setReferenceCode(referenceGeneratorService.generateReference("BOOK));
                BookApplication savedBook = bookRepository.save(book);

swagger上,当我发送许多保存请求时,有时可能无法保存。由于重复和唯一性。 Concurrency

我该如何预防?

锁或其他东西?我也不想丢失数据。

我可以使用悲观主义锁,但也许还有其他方法吗? 我也可以更改使其独特的方法,但我想保留它。

赞这个 https://stackoverflow.com/a/53259441/10309977

我将synchronized放到方法中,但我又可以得到错误信息。

@Override
    public synchronized String generateReference(String productCode) {

我放在这里。

也许我应该上BookService.java课?

0 个答案:

没有答案