我遇到这种情况:
父实体:
@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
在父母身边,所以应该可以这样做,所以我不需要在保存之前设置它。
有人能澄清这个问题吗?
非常感谢
答案 0 :(得分:0)
问题是由于User
和Address
之间的关系被标记为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;
}