Я использую весеннюю загрузку данных JPA, как показано ниже

 @Entity
  @Table(name = "invoice")
  @Getter
  @Setter
  @ToString
  public class Invoice {


   @Id
    @Column(name = "inv_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private BigInteger invId;

    @Column(name = "external_id")
    private String externalInvoiceId;

    @Column(name = "amount")
    private double amount;

    @JsonIgnore
    @JsonIgnoreProperties
    @Column(name = "status")
    private int status;

    @JsonProperty("status")
    @Transient
    private String invoiceStatus;


    public String getInvoiceStatus() {
        switch (this.status){
            case 1:
                return "INITIATED";
            case 2:
                return "CANCELLED";
            case 3:
                return "SUCCESS";
            case 4:
                return "FAILURE";
            default:
                return "IN PROGRESS";

        }

    }

    @CreationTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "created_at")
    private Date createdAt;

    @UpdateTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "updated_at")
    private Date updatedAt;


    @PostPersist
    public void updateExternalID() {
        this.externalInvoiceId="G".concat(String.valueOf(this.invId.multiply(BigInteger.valueOf(1000))))
                                  .concat(String.valueOf(Instant.now().getEpochSecond()));

    }
}

Доступ к этой сущности через репозиторий, как показано ниже

public interface InvoicesRepository extends JpaRepository<Invoice, BigInteger> {
}

На моем @Service выполняю следующую операцию

@Autowired
    private InvoicesRepository myInvoicesRepository;

    Invoice transactionInvoice = new Invoice();
    transactionInvoice.setAmount(200.0);
    transactionInvoice.setStatus(1);
    Invoice savedInvoice = myInvoicesRepository.save(transactionInvoice);

Я использую savedInvoice и пытаюсь обновить статус. Либо он не обновляет статус должным образом, либо я также не смог найти запись в базе данных.

Нет отката

Ниже приведены журналы, которые я мог видеть, присутствуют операторы вставки.

[XNIO-1 task-1] DEBUG org.hibernate.SQL.logStatement -
    /* insert com.min.app.model.Invoice
        */ insert
        into
            invoice
            (amount, created_at, external_inv_id, status, updated_at)
        values
            (?, ?, ?, ?, ?)
Hibernate:
    /* insert com.min.app.model.Invoice
        */  insert
        into
            invoice
            (amount, created_at, external_inv_id, status, updated_at)
        values
            (?, ?, ?, ?, ?)

После обновления статуса я попытался распечатать savedInvoice, чтобы увидеть ниже в журналах

Invoice(invId=58, externalInvoiceId=G580001575271905, amount=185.0 status=4, invoiceStatus=FAILURE, createdAt=Mon Dec 02 13:01:45 IST 2019, updatedAt=Mon Dec 02 13:01:45 IST 2019)

Приведенную выше запись я не смог увидеть в таблице.

Что я делаю не так?

0
balaaagi 2 Дек 2019 в 10:43
Вы осторожно создаете и изменяете счет за пределами транзакции.
 – 
JB Nizet
2 Дек 2019 в 10:47
Метод сохранения JpaRepository - транзакционный.
 – 
Simon Martinelli
2 Дек 2019 в 10:48
Какую базу данных вы используете? Установите регистратор гибернации и проверьте, есть ли оператор вставки
 – 
Simon Martinelli
2 Дек 2019 в 10:48
Конечно, если сервис, который сохраняет, а затем обновляет созданный объект, не является транзакционным, транзакция открывается методом save () репозитория и фиксируется, как только функция save () возвращается, и, таким образом, служба изменяет отсоединенный объект.
 – 
JB Nizet
2 Дек 2019 в 10:49
1
Может попробовать saveAndFlush вместо метода save?
 – 
Amit Naik
4 Дек 2019 в 07:30

1 ответ

Вам нужно выполнить транзакции в вызове функции следующим образом и поместить свой репозиторий @Autowired в задание глобального уровня следующим образом.

class whatever{
@Autowired
    private InvoicesRepository myInvoicesRepository;

//call this function
void doSomething(){
    Invoice transactionInvoice = new Invoice();
    transactionInvoice.setAmount(200.0);
    transactionInvoice.setStatus(1);
    Invoice savedInvoice = myInvoicesRepository.save(transactionInvoice);
}
}
0
Paradox 7 Дек 2019 в 16:59
Несмотря на то, что я не предоставил полный класс обслуживания, о котором я упомянул, в приложении все обстоит именно так.
 – 
balaaagi
9 Дек 2019 в 08:09