Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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 具有共享id的OneToOne关系要求子级了解父级_Java_Jpa_Spring Data - Fatal编程技术网

Java 具有共享id的OneToOne关系要求子级了解父级

Java 具有共享id的OneToOne关系要求子级了解父级,java,jpa,spring-data,Java,Jpa,Spring Data,在使用Spring数据将下面提供的实体存储到数据库时,我遇到了一个问题。在这两者之间使用一对一关系。仅当parentObject显式设置为childObject时,它才起作用。这不是一个好的解决方案,因为我希望子对象根本没有父对象。有没有可能? 与此相关的问题已发布 但是,我确实不喜欢将parentObject设置为ChildObject: ChildObject childObject = new ChildObject("name"); ParentObject parentObject =

在使用Spring数据将下面提供的实体存储到数据库时,我遇到了一个问题。在这两者之间使用一对一关系。仅当parentObject显式设置为childObject时,它才起作用。这不是一个好的解决方案,因为我希望子对象根本没有父对象。有没有可能? 与此相关的问题已发布

但是,我确实不喜欢将parentObject设置为ChildObject:

ChildObject childObject = new ChildObject("name");
ParentObject parentObject = new ParentObject(12L, childObject);
childObject.setParentObject(parentObject);
这是拥有共享id的唯一方法吗?如果未显式设置parentObject,则引发以下错误:

Caused by: org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property [test.ChildObject.parentObject]
    at org.hibernate.id.ForeignGenerator.generate(ForeignGenerator.java:83) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:101) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
    at org.hibernate.jpa.event.internal.core.JpaPersistEventListener.saveWithGeneratedId(JpaPersistEventListener.java:67) ~[hibernate-entitymanager-5.0.11.Final.jar:5.0.11.Final]

由于您具有双向关系(两侧都有OneToOne注释),您需要在另一侧保留关系每一侧的引用,如果您不喜欢,可以通过从一侧删除引用和映射将关系转换为单向关系。

因为您具有双向关系(两侧都有一个OneTONE注释)您需要在另一侧保留关系每一侧的引用,如果您不喜欢,可以通过从一侧删除引用和映射将关系转换为单向关系。

您可以轻松地封装操作,这样就不需要有问题的调用:的确,您应该始终执行以下操作是为了使内存模型始终处于一致状态:

public class ParentObject{

    public ParentObject(Long age, ChildObject childObject) {
        this.age = age;
        this.childObject = childObject;

        childObject.setParentObject(this);
    }

    public void setChildObject(ChildObject childObject) {
        this.childObject = childObject;
        childObject.setParentObject(this);
    }
}
现在,域模型API的客户机不需要知道任何关于从子级到父级的反向引用的信息

ChildObject childObject = new ChildObject("name");
ParentObject parentObject = new ParentObject(12L, childObject); //all relationships now set correctly

您可以轻松地封装操作,这样就不需要有问题的调用:实际上,您应该始终这样做,以便内存中的模型始终处于一致状态:

public class ParentObject{

    public ParentObject(Long age, ChildObject childObject) {
        this.age = age;
        this.childObject = childObject;

        childObject.setParentObject(this);
    }

    public void setChildObject(ChildObject childObject) {
        this.childObject = childObject;
        childObject.setParentObject(this);
    }
}
现在,域模型API的客户机不需要知道任何关于从子级到父级的反向引用的信息

ChildObject childObject = new ChildObject("name");
ParentObject parentObject = new ParentObject(12L, childObject); //all relationships now set correctly

我已经从ChildObject类中删除了parentObject字段,添加了@JoinColumn(name=“child\u id”)private ChildObject ChildObject to parentObject并删除了mappedBy。我可能遗漏了一些内容,因为在给出建议后引发了以下错误:由以下原因引起:org.hibernate.id.IdentifierGenerationException:在调用save()之前必须手动分配此类的id:我已经从ChildObject类中删除了parentObject字段,添加了@JoinColumn(name=“child\u id”)private ChildObject ChildObject to parentObject并删除了mappedBy。我可能遗漏了一些内容,因为在给出建议后引发了以下错误:由以下原因引起:org.hibernate.id.IdentifierGenerationException:在调用save()之前必须手动分配此类的id:好的,目的是获取工作单向关系。在子类@Id@Column(name=“child\u Id”,unique=true,nullable=false)私有长Id中;在父类@OneToOne(orphanRemoving=true,cascade=CascadeType.ALL)中@JoinColumn(name=“child\u Id”)private ChildObject ChildObject;但错误是由以下原因引起的:org.hibernate.id.IdentifierGenerationException:在调用save()之前,必须手动分配此类的id如果关系是单向的,您不应该在关系的每一侧都有引用,例如,要使关系从ParentObject到ChildObject是单向的,您需要删除ChildObjectOk中的ParentObject引用,目的是获取工作单向关系。在child class@Id@Column中(name=“child_Id”,unique=true,nullable=false)私有长id;在父类中:@OneToOne(orphanRemoving=true,cascade=CascadeType.ALL)@JoinColumn(name=“child_id”)private ChildObject ChildObject;但错误是由以下原因引起的:org.hibernate.id.IdentifierGenerationException:在调用save()之前,必须手动分配此类的id如果关系是单向的,则不应在关系的每一侧都有引用,例如,要使关系从ParentObject到ChildObject是单向的,则需要删除ChildObject中的ParentObject引用