在没有 parent 的情况下坚持 child 时,双向 @OneToOne 不起作用

Bidirectional @OneToOne not work when persisting child without parent

我有这种情况:

Parent实体:

@Entity
public class Address {

  @OneToOne( optional = false, targetEntity = User.class, fetch = FetchType.LAZY, orphanRemoval = true )
  @JoinColumn( name = "id_user", referencedColumnName = "id" )
  private User user;

}

Child实体:

@Entity
public class User {

   @OneToOne( optional = false, targetEntity = Address.class, mappedBy = "user", fetch = FetchType.LAZY, orphanRemoval = true )
   private Address address;
}

如你所见,双方都没有任何级联操作。但是当我保存一个用户时:

userRepository.save( new User() ); 

它抛出这个异常:

org.springframework.dao.DataIntegrityViolationException: not-null property references a null or transient value : org.company.models.User.address; nested exception is org.hibernate.PropertyValueException: not-null property references a null or transient value : org.company.models.User.address
.............
Caused by: org.hibernate.PropertyValueException: not-null property references a null or transient value : org.company.models.User.address

我只想持久化child,应该可以,因为@JoinColumn在parent里面,所以保存前不需要设置。
有人可以澄清这个问题吗? 非常感谢

问题是由于 UserAddress 之间的关系被标记为 optional=false,这意味着它不能为空。

因此,您要么需要使用 optional=true 并允许空值,要么在 User 上填充 Address 关系,然后再坚持下去。

我假设您在地址 table 中的 id_user 处得到了空值。因为在映射期间,jpa 没有在地址中设置用户的值。您需要在用户实体的地址 setter 中明确地执行此操作,如下所示。

public void setAddress(Address address) {
   address.setStudent(this);
   this.address = address;
}