Hibernate 验证器在验证级联对象时以错误的顺序使用组序列

问题描述 投票:0回答:0

Hibernate 验证器在验证级联插入对象时使用组序列。如果级联对象被验证,SQL 将被执行。虽然它最终会回滚,但这将导致无效的数据库命中。

我试过使用@Valid和@ConvertGroup,但只是报告顺序正确,插入级联对象的SQL仍然执行。

非常感谢任何帮助。

@Getter
@Setter
@ToString
@GroupSequence({Primary.class, Cascade.class, Account.class})
@Entity
public class Account {

    @Id
    @AutoGenerator
    private Long id;

    @NotBlank(groups = Primary.class)
    private String alias;

    @NotNull(groups = Cascade.class)
    @ManyToOne(cascade = {CascadeType.PERSIST}, optional = false)
    private User user;

    @PrePersist
    private void createDefaultUser() {
        if (null == user) {
            user = new User();
            user.setNickname(alias);
        }
    }
}
@Getter
@Setter
@ToString
@Entity
public class User {

    @Id
    @AutoGenerator
    private Long id;
    
    private String nickname;
}

以下是部分堆栈信息,使用了一些自定义实用类。

2023-03-03T13:15:00.690+08:00  INFO 3828 --- [           main] c.e.a.a.s.c.j.h.HibernateInspector       : ====== afterTransactionBegin ======
2023-03-03T13:15:00.692+08:00  INFO 3828 --- [           main] c.e.a.a.server.config.AppRunner          : ====== run ======
2023-03-03T13:15:00.693+08:00  INFO 3828 --- [           main] c.e.a.a.s.c.j.v.JpaRepositoryAspect   : ====== before ====== save ======
2023-03-03T13:15:00.722+08:00  INFO 3828 --- [           main] c.e.a.a.server.domain.security.Account   : ====== createDefaultUser ======
2023-03-03T13:15:00.731+08:00  INFO 3828 --- [           main] c.e.a.a.s.c.j.h.HibernateInspector       : ====== onSave ====== User ======
2023-03-03T13:15:00.738+08:00  INFO 3828 --- [           main] c.e.a.a.s.c.j.h.HibernateInspector       : ====== onSave ====== Account ======
2023-03-03T13:15:00.739+08:00  INFO 3828 --- [           main] .a.s.c.j.h.HibernateSessionEventListener : ====== flushStart ======
2023-03-03T13:15:00.743+08:00  INFO 3828 --- [           main] c.e.a.a.s.c.j.h.HibernateEventListener   : ====== onPreInsert ====== User ======
2023-03-03T13:15:00.753+08:00  INFO 3828 --- [           main] .a.a.s.c.j.h.HibernateStatementInspector : ====== inspect ====== insert into sys_user (nickname, id) values (?, ?) ======
[Hibernate] 
    insert 
    into
        sys_user
        (nickname, id) 
    values
        (?, ?)
2023-03-03T13:15:00.755+08:00  INFO 3828 --- [           main] .a.s.c.j.h.HibernateSessionEventListener : ====== jdbcExecuteStatementStart ======
2023-03-03T13:15:00.756+08:00  INFO 3828 --- [           main] .a.s.c.j.h.HibernateSessionEventListener : ====== jdbcExecuteStatementEnd ======
2023-03-03T13:15:00.756+08:00  INFO 3828 --- [           main] c.e.a.a.s.c.j.h.HibernateEventListener   : ====== onPostInsert ====== User ======
2023-03-03T13:15:00.756+08:00  INFO 3828 --- [           main] c.e.a.a.s.c.j.h.HibernateEventListener   : ====== onPreInsert ====== Account ======
2023-03-03T13:15:00.771+08:00  INFO 3828 --- [           main] .a.s.c.j.h.HibernateSessionEventListener : ====== transactionCompletion ====== false ======
2023-03-03T13:15:00.771+08:00  INFO 3828 --- [           main] c.e.a.a.s.c.j.h.HibernateInspector       : ====== afterTransactionCompletion ====== MARKED_ROLLBACK ======
2023-03-03T13:15:00.773+08:00  INFO 3828 --- [           main] .s.b.a.l.ConditionEvaluationReportLogger : 

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2023-03-03T13:15:00.784+08:00 ERROR 3828 --- [           main] o.s.boot.SpringApplication               : Application run failed
hibernate hibernate-validator
© www.soinside.com 2019 - 2024. All rights reserved.