在没有 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里面,所以保存前不需要设置。
有人可以澄清这个问题吗?
非常感谢
问题是由于 User
和 Address
之间的关系被标记为 optional=false
,这意味着它不能为空。
因此,您要么需要使用 optional=true
并允许空值,要么在 User
上填充 Address
关系,然后再坚持下去。
我假设您在地址 table 中的 id_user 处得到了空值。因为在映射期间,jpa 没有在地址中设置用户的值。您需要在用户实体的地址 setter 中明确地执行此操作,如下所示。
public void setAddress(Address address) {
address.setStudent(this);
this.address = address;
}
我有这种情况:
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里面,所以保存前不需要设置。
有人可以澄清这个问题吗?
非常感谢
问题是由于 User
和 Address
之间的关系被标记为 optional=false
,这意味着它不能为空。
因此,您要么需要使用 optional=true
并允许空值,要么在 User
上填充 Address
关系,然后再坚持下去。
我假设您在地址 table 中的 id_user 处得到了空值。因为在映射期间,jpa 没有在地址中设置用户的值。您需要在用户实体的地址 setter 中明确地执行此操作,如下所示。
public void setAddress(Address address) {
address.setStudent(this);
this.address = address;
}