双向@OneToOne在没有父级的情况下持久保存时不起作用

时间:2018-05-26 16:38:17

标签: hibernate jpa spring-data-jpa one-to-one bidirectional

我遇到这种情况:

父实体:

@Entity
public class Address {

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

}

子实体:

@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

我想只保留孩子,因为@JoinColumn在父母身边,所以应该可以这样做,所以我不需要在保存之前设置它。
有人能澄清这个问题吗? 非常感谢

2 个答案:

答案 0 :(得分:0)

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

因此,您需要使用optional=true并允许空值或在Address上填充User关系,然后才能保留它。

答案 1 :(得分:0)

我假设您在地址表中的 id_user 处获得了空值。因为在映射过程中,jpa 没有在 address 中设置 user 的值。您需要在 User 实体中的 Address 的 setter 中明确地进行如下操作。

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