[英]Bidirectional one-to-one relation fails on saving if @NotNull used
我在User
和UserSetup
实体之间存在以下一对一关系:
@Entity
class User {
@OneToOne(mappedBy = "user", optional = false, cascade = ALL)
private UserSetup setup;
public User() {
this.setup = new UserSetup(this);
}
}
和
@Entity
public class UserSetup {
@OneToOne(cascade = ALL)
@JoinColumn(name = "USER_ID", nullable = false, unique = true)
private User user;
public UserSetup(User user) {
this.user = user;
}
}
这一切都运行良好,但是如果我将@NotNull
添加到User
类中的setup
字段并在User
repository上调用save
,则它会失败:
由以下原因引起:javax.persistence.RollbackException:在org.hibernate.engine.transaction.internal.TransactionImpl.commit上的org.hibernate.internal.ExceptionConverterImpl.convertCommitException(ExceptionConverterImpl.java:77)中提交事务时出错(TransactionImpl.java: 71)at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517)... 64更多引起:javax.validation.ConstraintViolationException:在组[javax]更新期间类[User]的验证失败。 validation.groups.Default,]约束违规列表:[ConstraintViolationImpl {interpolatedMessage ='may not null',propertyPath = setup,rootBeanClass = class User,messageTemplate ='{javax.validation.constraints.NotNull.message}'}]
这是怎么回事? 在调试器中,我看到setup
字段。 或者@NotNull
不应该与@OneToOne
一起使用,但是应该使用optional
?
根据我对Hibernate如何工作的理解,这可能是不可能的,因为Hibernate必须首先保存其中一个对象,而在保存第一个对象时,第二个对象不能在数据库中引用。
您可以做的是将@NotNull
注释放在User
类的setup
字段中,因为我知道您可能不想在没有任何设置的情况下创建User
,并且级联将负责删除链接的UserSetup
对象以防您删除User
。
在我看来, @Notnull
不能在User for UserSetup中使用。 这是因为,需要首先创建用户,然后使用相同用户的ID来保存UserSetup,因为它有一个外键约束。 即使代码明智,它看起来还不错,DB参与创建ID是这里的一个重要因素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.