Моя проблема похожа на другие сообщения, такие как:
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();
}}