Активация данных JPA Bytecode, по -видимому, мешает меканизму Spring JPAJAVA

Программисты JAVA общаются здесь
Anonymous
Активация данных JPA Bytecode, по -видимому, мешает меканизму Spring JPA

Сообщение Anonymous »

У меня есть проект JPA Spring Data, где улучшение байткода было активировано в pom.xml < /p>

Код: Выделить всё


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 {

...
}
Теперь, чтобы активировать механизм аудита в моем проекте, у меня есть класс Auditoraware Impl

Код: Выделить всё

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;
}
}
и бон этого класса, загруженный в @configuration класс:

Код: Выделить всё

  @Bean
AuditorAware auditorProvider() {
return new AuditorAwareImpl();
}
Теперь проблема заключается в том, что я вижу поля Create_by и Create_date , обновленные в базе данных, когда я создаю новые данные в таблице панели управления . С другой стороны, невозможно сделать оба поля Modified_date и modified_by , чтобы быть обновленными при изменении объекта панели инструментов (Nothig обновляется/отражается в таблице панели инструментов).
Завлекательный момент заключается в том, что если я избавляюсь от улучшения батареи, то я могу сделать это правильно. Все поля обновляются, как и должно быть (при создании объектов, созданных поля, и когда я редактирую сущность, поля обновления также обновляются правильно) ... < /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

Вернуться в «JAVA»