繁体   English   中英

如果使用@NotNull,则保存时双向一对一关系失败

[英]Bidirectional one-to-one relation fails on saving if @NotNull used

我在UserUserSetup实体之间存在以下一对一关系:

@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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM