javax.persistence.EntityNotFoundException при запросе AuditEntity, когда запись существует в базе данных - PullRequest
0 голосов
/ 04 декабря 2018

В настоящее время я использую Spring Boot 2.1.1.RELEASE, Hibernate Envers 5.3.7.Final.

Когда я запрашиваю свой AuditEntity для моего класса User, он выдаст исключение javax.persistence.EntityNotFoundException, сказав, что моя запись User не существует.Однако в базе данных она существует.Кто-нибудь знает, почему?

Пользовательский объект

@Entity
@EntityListeners(AuditingEntityListener.class)
@Audited
@Table(name = "[user]") 
@Getter
@Setter
@NoArgsConstructor
public class User implements Serializable {


    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(nullable = false, unique = true)
    @Length(max = 20)
    @Unique
    private String username;

    @Column(nullable = false)
    private String password;

    @Column
    private String email;

    @Column(nullable = false)
    private String name;


    @Audited(targetAuditMode = NOT_AUDITED)
    @ManyToOne(fetch = FetchType.LAZY)
    @CreatedBy
    private User createByUser;

    @CreatedDate
    private LocalDateTime createDatetime;

    @Audited(targetAuditMode = NOT_AUDITED)
    @ManyToOne(fetch = FetchType.LAZY)
    @LastModifiedBy
    private User updateByUser;

    @LastModifiedDate
    private LocalDateTime updateDatetime;

    @Column
    private Boolean active = true;

    @Column
    private Boolean deleted = false;

}

При запросе объекта аудита свойство createByUser updateByUser выдает исключение javax.persistence.EntityNotFoundException: Невозможно найти data.entity.Пользователь с идентификатором 2. Однако в базе данных у меня есть эта запись.

AuditReader auditReader = AuditReaderFactory.get(entityManager);
AuditQuery query = auditReader.createQuery().forRevisionsOfEntity(User.class, true, true);
query.add(AuditEntity.id().eq(id));

return query.getResultList();

РЕДАКТИРОВАНИЕ на 2018-12-05

Кажется, проблема в проблемес этой записью id 2 я вставляю эти записи из бэкэнда, а не через внешний интерфейс, который сгенерирует запись в таблице _aud.Не уверен, как работает эта логика аудита.

1 Ответ

0 голосов
/ 04 февраля 2019

Я понял, что это действительно связано с отсутствием записей в таблице _aud.

Вместо вставки записей теста непосредственно в бэкэнд.Я решил создать подпрограмму в классе Application весенней загрузки.

@SpringBootApplication(
        exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class})
@EntityScan(basePackageClasses = {WebApplication.class})
@EnableAsync
@EnableCaching
@EnableTransactionManagement
@EnableConfigurationProperties
public class WebApplication extends SpringBootServletInitializer {


    public static void main(String[] args) {
        SpringApplication.run(WebApplication.class, args);
    }

    @Bean
    public CommandLineRunner setUpInitialData(
            EntityRepository1 entityRepository1,
            EntityRepository2 entityRepository2) {

        return args -> {
        // do all data insertion here...
        };
    }
}

Либо эта, либо таблица _aud также должна содержать соответствующую запись для сущности.

...