У меня возникла проблема с аудитом JPA и для @Embedded
пользователей. Рассмотрим следующий пример сценария:Аудит и @ Уложенные весной данные JPA
я создать тестовую таблицу в качестве БД Oracle:
CREATE TABLE AUDIT_TEST (
ID NUMBER(38) NOT NULL PRIMARY KEY,
CREATION_DATE TIMESTAMP(6) DEFAULT SYSTIMESTAMP NOT NULL
);
Я определяю JPA @Entity
с аудитом:
@Entity
@EntityListeners(AuditingEntityListener.class)
@Table(name = "AUDIT_TEST")
public class AuditTest {
private Long id;
private LocalDateTime creationDate;
@Id
@Column(name = "ID")
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
@CreatedDate
@Column(name = "CREATION_DATE")
public LocalDateTime getCreationDate() { return creationDate; }
public void setCreationDate(LocalDateTime creationDate) {
this.creationDate = creationDate;
}
}
Наконец, я включаю JPA аудита в мой @Configuration
:
@SpringBootApplication()
@EnableJpaAuditing()
public class AuditTestApplication {
}
Пока все хорошо; когда я создаю экземпляр AuditTest
, назначьте его id и commit, столбец creationDate
будет заполнен текущей временной меткой, как и ожидалось.
Однако, вещи перестают работать, когда я инкапсулировать столбец аудита в качестве @Embeddable
:
@Embeddable
public class AuditTestEmbeddable {
private LocalDateTime creationDate;
@CreatedDate
@Column(name = "CREATION_DATE")
public LocalDateTime getCreationDate() { return creationDate; }
public void setCreationDate(LocalDateTime creationDate) {
this.creationDate = creationDate;
}
}
Тогда я изменить мой класс сущностей вставлять дату создания:
@Entity
@EntityListeners(AuditingEntityListener.class)
@Table(name = "AUDIT_TEST")
public class AuditTest {
private Long id;
private AuditTestEmbeddable auditTestEmbeddable = new AuditTestEmbeddable();
@Id
@Column(name = "ID")
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
@Embedded
public AuditTestEmbeddable getAuditTestEmbeddable() {
return auditTestEmbeddable;
}
public void setAuditTestEmbeddable(AuditTestEmbeddable auditTestEmbeddable) {
this.auditTestEmbeddable = auditTestEmbeddable;
}
}
И, к сожалению, аудит больше не работает.
Кто-нибудь здесь знает о способе сохранения функциональности аудита при использовании классов @Embedded
?
Информация должна быть на управляемый объект (по крайней мере, как это делается и сейчас работает). Поэтому в настоящее время нет другого способа добавить его непосредственно к сущности. –
Привет, поэтому единственная доступная опция заключается в том, чтобы добавлять к каждому сущности необходимые поля, такие как: создатель пользователя, пользовательский модуль обновления, дата создания даты, дата updateDate; Правильно ли это? – Paolo