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