当前位置: 首页 > 知识库问答 >
问题:

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

翟沈义
2023-03-14

我在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;
    }
}

这一切工作得很好,但是如果我添加@NotNullUser类中的安装字段,并调用User存储库上保存,则会失败:

原因:javax。坚持不懈RollbackException:在组织提交事务时出错。冬眠内部的例外情况ConverterImpl。org上的ConvertCommitteException(ExceptionConverterImpl.java:77)。冬眠发动机交易内部的TransactionImpl。在org上提交(TransactionImpl.java:71)。springframework。奥姆。jpa。JpaTransactionManager。doCommit(JpaTransactionManager.java:517)。。。还有64个原因:javax。验证。ConstraintViolationException:在组[javax.Validation.groups.Default]的更新期间,类[User]的验证失败,约束冲突列表:[ConstraintViolationImpl{interpolatedMessage='may not null',propertyPath=setup,rootBeanClass=class User,messageTemplate='{javax.Validation.constraints.NotNull.message}]

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

共有2个答案

归建安
2023-03-14

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

牧璞
2023-03-14

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

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

 类似资料:
  • 问题内容: 我试图保持一个非常简单的单向一对多关系,但是EclipseLink(2.3.1)失败。 服务等级(家长): 参数类(子级):( 当然,数据库中有“ service_id”外键字段,由于它是单向关系,因此未在类中表示)。 这是实体持久性的代码: 我得到这个异常: 编辑:由于数据的性质,数据库字段具有(并且应该具有)非空约束。 这是错误还是代码有问题? 问题答案: 尝试删除参数表的serv

  • 我已经试着解决这件事很长一段时间了,但我什么也没得到。我一直在试图保存一个实体,该实体拥有对另一个实体的引用。 用户通过填写表单创建一个place实体,然后按save保存该实体。它应该自动在“places”和“place\u url”表中创建新行。下面是我正在加载到应用程序中的SQL文件的链接:https://pastebin.com/x8Gvk7ub 母实体: 子实体: 控制器: Hiberna

  • 问题内容: 我与共享密钥具有一对一的双向实体关系。当我尝试保存关联的所有者时,对于该关系的拥有方,我收到一个“生成的null ID”异常。我正在使用hibernate- entitymanager并使用spring进行事务管理。 所属实体 所属实体 并且下面的代码用于保存实体: 在休眠3.5.0-最终版中,这一切都可以正常工作。尝试升级到3.5.6-Final或3.6.0.Final时,是我开始获

  • 问题内容: 我与共享密钥具有一对一的双向实体关系。当我尝试保存关联的所有者时,对于该关系的拥有方,我收到一个“生成的null ID”异常。我正在使用hibernate- entitymanager并使用spring进行事务管理。 所属实体 所属实体 并且以下代码用于保存实体: 在hibernate3.5.0-最终版中,这一切都可以正常工作。尝试升级到3.5.6-Final或3.6.0.Final时

  • 在双向多对多关系中,我有两个类,如下所示: 我在我的DAO中打了一个电话以得到一个特定的家长。除了家长的详细信息,我想把家长的孩子们带来。大概是这样的: 但是,当我在业务服务中执行以下操作,同时将数据返回给控制器时,父json字符串中会忽略子项。 因此,我删除了父类中的@JsonIgnore on子属性,认为jackson可能会理解在写入字符串时不能忽略这些字段,如下所示。但它仍然忽略他们!:(

  • 给定以下具有双向一对多关系的JPA实体 如果我从已经包含一些项目的数据库加载购物车 我想用一个新的物品集合替换购物车中的物品 执行此更换的最简单/最佳方法是什么?理想情况下,我希望生成的SQL语句合理高效,但我的主要目标是使用简洁易读的代码执行替换。 为了明确我所说的替换是什么意思,如果购物车最初包含ID为2、3、4的项目,并且包含4、5、6,那么在替换之后,购物车应该包含ID为4、5、6的项目。