我有两个实体:

@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
});

错误

最佳答案

在这种情况下,UserDetails对象是UserUserDetails之间关系的拥有方

受管实体之间的双向关系将根据该关系拥有方所拥有的引用来保留。

因此,当您说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);
});

关于java - Hibernate尝试从空的一对一属性分配ID,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39432871/

10-13 09:33