簡體   English   中英

Hibernate 嘗試從 null 一對一屬性分配 id

[英]Hibernate attempted to assign id from null one-to-one property

我有兩個實體:

@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 行,我不想要它。 我必須從數據庫中獲取一個 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
});

錯誤

org.springframework.orm.jpa.JpaSystemException: 試圖從空一對一屬性 [com.app.domain.UserDetails.user] 中分配 id; 嵌套異常是 org.hibernate.id.IdentifierGenerationException:試圖從空一對一屬性 [com.app.domain.UserDetails.user] 分配 id

在這種情況下, 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);
});

的答案對我非常有幫助,很難理解休眠的工作原理......至少對我來說(菜鳥:D)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM