【问题标题】:Bidirectional one-to-one relation fails on saving if @NotNull used如果使用@NotNull,则双向一对一关系无法保存
【发布时间】:2018-03-29 08:11:48
【问题描述】:

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 存储库上调用 save 它将失败:

原因:javax.persistence.RollbackException:提交时出错 交易在 org.hibernate.internal.ExceptionConverterImpl.convertCommitException(ExceptionConverterImpl.java:77) 在 org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:71) 在 org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517) ... 64 更多原因:javax.validation.ConstraintViolationException: 期间类 [User] 的验证失败 组的更新时间 [javax.validation.groups.Default, ] 列表 违反约束:[ ConstraintViolationImpl{interpolatedMessage='不能为空', propertyPath=setup,rootBeanClass=class 用户, messageTemplate='{javax.validation.constraints.NotNull.message}'} ]

发生了什么事?在调试器中,我看到 setup 字段已设置。或者@NotNull 不应该与@OneToOne 一起使用,而应该使用optional

【问题讨论】:

  • 列是用not null创建的吗?
  • @XtremeBaumer,是的,该列具有非空约束。
  • 如何为这两个实体创建IDs?
  • 你使用GenerationType.IDENTITY,而实际上它是GenerationType.SEQUENCE
  • 好吧,如果生成类型错误,我怀疑hibernate能否创建一个ID。这意味着,它不能创建一个新的UserSetup 连接到User

标签: java spring hibernate jpa spring-data


【解决方案1】:

根据我对 Hibernate 工作原理的理解,这可能是不可能的,因为 Hibernate 必须首先保存一个对象,而在保存第一个对象时,第二个对象无法在数据库中引用。

您可以做的是将@NotNull 注释放在User 类中的setup 字段中,据我所知,您可能不想在没有任何设置的情况下创建User,并且级联会处理删除链接的UserSetup 对象以防删除User

【讨论】:

  • 我不明白。我已经输入了@NotNull,但正如我在问题中所说的那样,它不起作用。
  • 对不起,我的意思是把 @NotNull 放在 User 类中,但将它删除到 UserSetup 类中。
  • 我从未有过这样的设置。
  • 从 UserSetup 中删除 nullable = false
【解决方案2】:

在我看来,@Notnull 不能在 User 中用于 UserSetup。这是因为,需要先创建 User,然后使用相同的用户 ID 来保存 UserSetup,因为它上面有外键约束。尽管代码方面看起来不错,但 DB 参与创建 ID 是这里的一个重要因素。

【讨论】:

  • 感谢您的回答,但这是您的想法还是您确定的?
  • 这是我的想法。在 UserSetup 类中的 @JoinColumn(name = "USER_ID", nullable = false, unique = true) 中使用 nullable = false 是有道理的,但在 User 类中使用 @NotNull for UserSetup 似乎会造成第 22 条问题。
  • 所以您建议将@NotNullnullable = false 放在一侧,有意义吗?
  • 不完全是,这两种方式略有不同。见stackoverflow.com/a/2726224/945214stackoverflow.com/a/7439544/945214
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
相关资源
最近更新 更多