JPA @Transient поле очищается до @PostUpdate - PullRequest
0 голосов
/ 14 апреля 2020

Моя проблема похожа на другие сообщения, такие как:

JPA @Transient поля, очищаемые до вызова метода @PreUpdate

JPA Переходные поля с обратным вызовом методы

но решение, которое предлагают другие пользователи, мне не работает, и я не знаю, что я делаю неправильно. Мой поток следующий: когда я выполняю обновление, поле audDescription заполняется, но когда это поле получено классом auditListener, становится пустым. Я добавил свойство updatable = true или false, но поле по-прежнему равно нулю. Когда я выполняю вставку, первый раз работает нормально.

Это мой класс обслуживания:

@Transactional
public void update(ParametrosDTO paramDTO) {
   try {
    Parametros entity = paramDao.findById(paramDTO.getIdParametro()).orElse(null);

    Parametros entity2 = modelMapper.map(paramDTO, Parametros.class);
    entity2.setAudDescription(
            String.format(EnumAuditDescription.ALTA_PARAMETROS.getDescription(), paramDTO.getNombre()));
    paramDao.save(entity2);
} catch (DataAccessException e) {
    if (e.getCause().getCause().getMessage().contains("NAME_TEC_IDX")) {
        log.error("Registro Duplicado");
        throw new TechnicalException("Registro Duplicado");
    }
    log.error("Error tecnico al insertar el nuevo parametro {}", e.getMessage());
    throw new TechnicalException("Error tecnico al insertar el nuevo parametro", e);
} catch (Exception e) {
    log.error("Error generico al grabar el nuevo parametro {}", e.getMessage());
    throw new BusinessException("Error generico en la insercion del nuevo parametro", e);
}}

Это класс сущности, а временное поле - "audDescription"

@Data
@Entity
@EntityListeners(AuditableListener.class)
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Parametros implements Serializable,Auditable {

 private static final long serialVersionUID = 1L;

 @Id
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 @Column(name="ID_PARAM")
 private Integer idParametro;

 @Column(name="NAME_TEC")
 private String nameTec;

 @Column(name="nombre")
 private String nombre;

 private Double valor;

 private Integer activo;

 @Transient
 private String audDescription;

 @Override
 public void setAudDescription(String audDescription) {
      this.audDescription = audDescription;   
 }

 @Override
 public String getAudDescription() {        
    return audDescription;
 }

 @Override
 public void setIdInmueble(Long idInmueble) {
  // TODO Auto-generated method stub
 }

 @Override
 public Long getIdInmueble() {
        // TODO Auto-generated method stub
   return null;
 }
 }

А это мой класс AuditListener.

@Slf4j
@Component
public class AuditableListener {


@PostPersist
public void saveAudit(Auditable entity) {
 perform(entity);        
}
@PreUpdate
public void updateAudit(Auditable entity) {
 perform(entity);        
}

public void perform(Auditable entity) {
try {
    EntityManager entityManager = BeanUtil.getBean(EntityManager.class);
    Auditoria auditoria = Auditoria.builder()
            .idAud(Long.parseLong(AgdUtils.getUUID()))
            .idInmueble(entity.getIdInmueble())
            .fecha(Timestamp.valueOf(LocalDateTime.now()))
            .createdBy(getUsuario())
            .accion(entity.getAudDescription()).build();                    
    entityManager.persist(auditoria);
} catch (Exception e) {
    log.error("Error al auditar:",e.getMessage());          
}}

private String getUsuario() {
     Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
     return authentication.getName();
}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...