我有两个实体:
@Entity
@Table
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "user")
private UserDetails userDetails;
}
@Entity
@Table(name="user_details")
public class UserDetails {
@GenericGenerator(name = "generator", strategy = "foreign",
parameters = @Parameter(name = "property", value = "user"))
@Id
@GeneratedValue(generator = "generator")
@Column(unique = true, nullable = false)
private Integer id;
@OneToOne
@PrimaryKeyJoinColumn
private User user;
public UserDetails(User user) {
this.user = user;
user.setUserDetails(this);
}
}
如果我使用userDetails创建用户,它会起作用。但后来它创建了一个UserDetails行,我不想要它。我必须从数据库中获取用户并稍后添加UserDetails:
userRepository.findOneById(id).map(user -> {
UserDetails userDetails = user.getUserDetails();
if (userDetails == null)
userDetails = new UserDetails(user);
userDetails.setEmail(email);
userRepository.save(user); //error here
});
错误
org.springframework.orm.jpa.JpaSystemException:尝试从null一对一属性[com.app.domain.UserDetails.user]中分配id;嵌套异常是org.hibernate.id.IdentifierGenerationException:尝试从null一对一属性中分配id [com.app.domain.UserDetails.user]
答案 0 :(得分:2)
在这种情况下,UserDetails
对象是User
和UserDetails
管理实体之间的双向关系将根据关系所属方持有的引用来保留。
因此,当你说userRepository.save(user)
时,你实际上是想从关系的孩子那边保存。
您需要创建一个UserDetailsRepository
并从该新对象调用保存。
即。这是代码应该是什么样的:
userRepository.findOneById(id).map(user -> {
UserDetails userDetails = user.getUserDetails();
if (userDetails == null)
userDetails = new UserDetails(user);
userDetails.setEmail(email);
userDetailsRepository.save(userDetails);
});