簡體   English   中英

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

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

我正在嘗試在 2 個實體之間創建一對一的關系,其中“子”被“父”ID 引用為外鍵。 這是我的 2 個實體:

@Entity
@Table(name = "users")
public class User extends PanacheEntityBase implements Serializable {

    @Id
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
    String id;

    @OneToOne(mappedBy = "user", cascade = CascadeType.ALL , optional = false)
    Profile profile;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Profile getProfile() {
        return profile;
    }

    public void setProfile(Profile profile) {
        this.profile = profile;
    }
}

@Entity
@Table(name = "profiles")
public class Profile extends PanacheEntityBase implements Serializable {

    @GenericGenerator(name = "generator", strategy = "foreign",  parameters = @Parameter(name = "property", value = "user"))
    @Id
    @GeneratedValue(generator = "generator")
    @Column(name = "user_id")
    String id;

    @OneToOne
    @MapsId
    @JoinColumn(name = "user_id")
    User user;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

在保存時,我構建對象並將其持久化:

    User user = new User();
    Profile profile = new Profile();
    user.setProfile(profile);
    userRepository.persist(user);

但我收到這個錯誤

org.jboss.resteasy.spi.UnhandledException:javax.persistence.PersistenceException:org.hibernate.id.IdentifierGenerationException:試圖從空一對一屬性[com.myne.entities.Profile.user]分配id

我究竟做錯了什么?

所以經過更多的研究,我終於能夠解決這個問題。 我在這 3 個帖子之間使用了混合

https://howtodoinjava.com/hibernate/hibernate-one-to-one-mapping/

https://stackoverflow.com/a/52010963/3353167

https://stackoverflow.com/a/18622821/3353167

正如第一篇文章所建議的,使用@MapsId 會讓休眠知道子實體將共享父實體的 id。 所以我改變了我的課程:

@Entity
@Table(name = "users")
public class User extends PanacheEntityBase implements Serializable {

    @Id
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
    String id;

    @OneToOne
    @MapsId
    Profile profile;

    ...

@Entity
@Table(name = "profiles")
public class Profile extends PanacheEntityBase implements Serializable {

    @Id
    @Column(name = "user_id")
    String id;
    
    // removed the User Column
    ...

然后問題來自使用 GenerationType.Auto 的 Hibernate,如第三篇文章中所建議的。 因此,為了指示 Hibernate 生成 UUID,我按照第二篇文章中的示例將 Profile id 更改為如下所示:

@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
@Column(name = "user_id", updatable = false, nullable = false)
@Id
String id; 

...

它就像一個魅力。 我希望它可以幫助將來遇到同樣問題的其他人

暫無
暫無

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

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