java Hibernate 尝试从 null 一对一属性分配 id
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/39432871/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Hibernate attempted to assign id from null one-to-one property
提问by Feeco
I have two entities:
我有两个实体:
@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);
}
}
It works if I create a user with a userDetails. But then it creates a UserDetails row and I don't want it. I have to fetch a User from database and add a UserDetails later:
如果我使用 userDetails 创建用户,它会起作用。但随后它创建了一个 UserDetails 行,我不想要它。我必须从数据库中获取一个 User 并稍后添加一个 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
});
Error
错误
org.springframework.orm.jpa.JpaSystemException: attempted to assign id from null one-to-one property [com.app.domain.UserDetails.user]; nested exception is org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property [com.app.domain.UserDetails.user]
org.springframework.orm.jpa.JpaSystemException:试图从空一对一属性 [com.app.domain.UserDetails.user] 中分配 id;嵌套异常是 org.hibernate.id.IdentifierGenerationException:试图从 null 一对一属性 [com.app.domain.UserDetails.user] 分配 id
回答by Trevor
The UserDetails
object in this case is the owning side of the relationship between a User
and the UserDetails
UserDetails
在这种情况下,对象是 aUser
和 the之间关系的拥有方UserDetails
Bidirectional relationships between managed entities will be persisted based on references held by the owning side of the relationship.
受管实体之间的双向关系将基于关系拥有方持有的引用而持久化。
Therefore, when you say userRepository.save(user)
, you're actually trying to save from the child side of the relationship.
因此,当您说 时userRepository.save(user)
,您实际上是在尝试从关系的孩子方面进行挽救。
You need to create a UserDetailsRepository
and invoke the save from that new object.
您需要创建一个UserDetailsRepository
并从该新对象调用保存。
i.e. here's what the code should look like:
即这里的代码应该是这样的:
userRepository.findOneById(id).map(user -> {
UserDetails userDetails = user.getUserDetails();
if (userDetails == null)
userDetails = new UserDetails(user);
userDetails.setEmail(email);
userDetailsRepository.save(userDetails);
});