【问题标题】:Hibernate OneToOne attempted to assign id from null one-to-one propertyHibernate OneToOne 试图从空的一对一属性分配 id
【发布时间】:2020-11-04 11:00:49
【问题描述】:

我正在尝试在 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

我做错了什么?

【问题讨论】:

  • 你试过做profile.setUser(user)吗?
  • 是的,但它会产生无限递归调用
  • 什么是新用户?您初始化用户字段,而不是 newuser
  • 你的设置有点奇怪,配置文件的PK是用户的ID吗?
  • @Ran 我的错误是用户。

标签: java hibernate one-to-one quarkus quarkus-panache


【解决方案1】:

所以经过更多的研究,我终于能够解决这个问题。我在这 3 个帖子之间使用了一个混合体

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

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

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

正如第一篇文章所建议的,使用@MapsId 会让hibernate 知道子实体将共享父实体的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
    ...

然后问题来自 Hibernate 使用 GenerationType.Auto,如第三篇文章中所建议的那样。因此,为了指示 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; 

...

它就像一个魅力。希望对以后遇到同样问题的人有所帮助

【讨论】:

  • 很抱歉,这是否意味着您不能在用户和个人资料之间建立双向关系?比如:用户有个人资料,但只有个人资料就无法获取用户?
猜你喜欢
  • 2021-01-16
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 2021-12-25
  • 2019-11-28
  • 1970-01-01
相关资源
最近更新 更多