Почему JPA @PreUpdate не вызывает после @PostLoad в той же транзакции? - PullRequest
1 голос
/ 29 марта 2019

Мой класс Bean:

package com.abcfinancial.api.generalledger.fee.domain;

import lombok.Data;
import org.hibernate.annotations.CreationTimestamp;

import javax.persistence.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.UUID;

@Data
@Entity
@Table( name = "fee" )
@EntityListeners( FeeListner.class )
public class Fee
{
    @Id
    @GeneratedValue( strategy = GenerationType.AUTO )
    @Column( name = "fee_id" )
    private UUID feeId;

    @Column( name = "accn_id" )
    private UUID accountId;

    @Column( Name = "fee_created" )
    @CreationTimestamp
    private LocalDateTime created;

    @Column( name = "fee_deactivated" )
    private LocalDateTime deactivated;

    @Column( name = "fee_modified" )
    @CreationTimestamp
    private LocalDateTime modified;

    @Column( name = "fm_key" )
    private String feeMode;

    @Column( name = "ft_key" )
    private String feeType;

    @Column( name = "ftt_key" )
    private String feeTransactionType;

    @Column( name = "fvt_key" )
    private String feeValueType;

    @Column( name = "fee_value" )
    private BigDecimal feeValue;

    @Transient
    private boolean active;

    @PostLoad
    @PrePersist
    @PreUpdate
    private void postLoad()
    {
        if( this.deactivated == null )
        {
            this.active = true;
        }
    }
}

В вышеприведенном классе я хочу активироваться за плату, используя переменную deactivated.если Плата деактивирована, то Плата неактивна, иначе наоборот. Эта концепция работает в случае создания, удаления и получения комиссии, но не работает для обновления.

В плате обновления мы получаем плату по идентификатору и обновляем одну.переменная в той же Transaction.Below мой код платы за обновление (метод обслуживания):

@Transactional
public UpdateFeeVO updateFeeDetails( UpdateFeeRequestVO updateFeeVO, UUID feeId )
{
    Optional<Fee> feeOptional = feeRepository.getDetailsByFeeId( feeId );//After this line feeOptional.get().getActive() give true
    if( feeOptional.isPresent() )
    {
        //update some variable
        feeRepository.save( feeOptional.get() );
        log.trace( "Fee: {}",feeOptional.get() );// feeOptional.get().getActive() give false
    }
}

Я не хочу вносить изменения в файл службы

Ответы [ 2 ]

1 голос
/ 29 марта 2019

Я думаю, вам не нужна эта активная переменная и этот метод postLoad.

Активированная переменная не сохраняется в любом случае.

Просто измените или переопределите получатель isActive () на

public boolean isActive(){
   return deactivated == null || deactivated.isAfter(LocalDateTime.now());
}
0 голосов
/ 01 апреля 2019

Вы используете это неправильно. Используйте сущностные списки вот так: https://www.concretepage.com/java/jpa/jpa-entitylisteners-example-with-callbacks-prepersist-postpersist-postload-preupdate-postupdate-preremove-postremove

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...