Код: Выделить всё
org.apache.maven.plugins
maven-compiler-plugin
11
11
org.hibernate.orm.tooling
hibernate-enhance-maven-plugin
5.6.14.Final
true
true
true
**enhance**
< /code>
Помимо этого, я также настроил механизм аудита Spring. Для этого у меня есть абстрактный объект под названием Audable Код: Выделить всё
@Getter
@Setter
@MappedSuperclass
@EntityListeners({AuditingEntityListener.class})
public abstract class Auditable {
@CreatedBy
@Column(name = "created_by", length = 255, updatable = false)
protected String createdBy;
@CreatedDate
@Column(
name = "created_date",
columnDefinition = "timestamp default '2021-06-10 20:47:05.967394'",
updatable = false)
@Temporal(TemporalType.TIMESTAMP)
protected Date createdDate;
@LastModifiedBy
@Column(name = "modified_by", length = 255)
protected String modifiedBy;
@LastModifiedDate
@Temporal(TemporalType.TIMESTAMP)
@Column(
name = "modified_date",
columnDefinition = "timestamp default '2021-06-10 20:47:05.967394'")
protected Date modifiedDate;
}
Код: Выделить всё
@Entity
@Table(name = "dashboard")
@NamedQuery(name = "Dashboard.findAll", query = "SELECT d FROM Dashboard d")
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
@TypeDef(name = "json", typeClass = JsonStringType.class)
@Data
public class Dashboard extends Auditable implements Serializable {
...
}
Код: Выделить всё
public class AuditorAwareImpl implements AuditorAware {
@Override
public Optional getCurrentAuditor() {
var auth = SecurityContextHolder.getContext().getAuthentication();
var retVal = Optional.of("");
if (auth instanceof AnonymousAuthenticationToken) {
retVal = retVal.of("anonymous");
} else if (auth instanceof OAuth2AuthenticationToken) {
retVal = retVal.of(((DefaultOidcUser) auth.getPrincipal()).getPreferredUsername());
} else {
retVal = retVal.of(((HydrowebUserDetails) auth.getPrincipal()).getName());
}
return retVal;
}
}
Код: Выделить всё
@Bean
AuditorAware auditorProvider() {
return new AuditorAwareImpl();
}
Завлекательный момент заключается в том, что если я избавляюсь от улучшения батареи, то я могу сделать это правильно. Все поля обновляются, как и должно быть (при создании объектов, созданных поля, и когда я редактирую сущность, поля обновления также обновляются правильно) ... < /p>
Таким образом, кажется, что улучшение Bytecode каким -то образом мешает Uneadit Mecanism, но только для модификации (_by and _date). Создайте поля (_by и _date), обновляются Alwayds. Является ли просто ошибка? Мы добавили следующий метод в классе Audable :
@PreUpdate
void preUpdate(){
var tempModifiedBy = this.modifiedBy;
this.setModifiedBy(null);
this.setModifiedBy(tempModifiedBy);
}
< /code>
Делать это, кажется, «стимулирует» меканизм аудита (при обновлении объекта JPA). И тогда оба поля обновляются с успехом в аудирена -таблице (modified_by и modified_date).
Подробнее здесь: https://stackoverflow.com/questions/754 ... spring-jpa