Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate OneToOne尝试从空的一对一属性分配id_Java_Hibernate_One To One_Quarkus_Quarkus Panache - Fatal编程技术网

Java Hibernate OneToOne尝试从空的一对一属性分配id

Java Hibernate OneToOne尝试从空的一对一属性分配id,java,hibernate,one-to-one,quarkus,quarkus-panache,Java,Hibernate,One To One,Quarkus,Quarkus Panache,我试图在两个实体之间创建一对一的关系,其中“父”id引用“子”作为外键。 以下是我的两个实体: @Entity @Table(name = "users") public class User extends PanacheEntityBase implements Serializable { @Id @GeneratedValue(generator = "UUID") @GenericGenerator(name = &qu

我试图在两个实体之间创建一对一的关系,其中“父”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(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;
    }
}

保存时,我构建对象并将其持久化:

    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篇文章中使用了一个混合体

正如第一篇文章所建议的,使用@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;

    ...

问题来自Hibernate使用GenerationType.Auto,正如第三篇文章中所建议的那样。因此,为了指示Hibernate生成UUID,我遵循了第二篇文章中的示例,将概要文件id更改为:

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

...

它就像一个符咒。我希望它能帮助将来面临同样问题的其他人

你试过使用profile.setUser(user)吗?是的,但它会产生无限递归调用什么是newuser?You init user field,而不是newuserYour setup有点奇怪,配置文件的PK是用户的ID吗?@Ran my error是user。
@Entity
@Table(name = "profiles")
public class Profile extends PanacheEntityBase implements Serializable {

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

...