具有共享 ID 的 OneToOne 关系需要孩子知道父母

维陶塔斯·阿米纳斯

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

@Entity
@Table(name = "parent_object")
public class ParentObject {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false)
private Long id;

@Column(name = "age")
private Long age;

@OneToOne(cascade = CascadeType.ALL, mappedBy = "parentObject")
private ChildObject childObject;

public ParentObject() {
}

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

public Long getId() {
    return id;
}

public Long getAge() {
    return age;
}

public ChildObject getChildObject() {
    return childObject;
}

public void setChildObject(ChildObject childObject) {
    this.childObject = childObject;
}
}

@Entity
@Table(name = "child_object")
public class ChildObject {
@Id
@Column(name = "child_id", unique = true, nullable = false)
private Long id;

@MapsId
@OneToOne
@JoinColumn(name = "child_id")
private ParentObject parentObject;

@Column(name = "name")
private String name;

public ChildObject() {
}

public ChildObject(String name) {
    this.name = name;
}

public Long getId() {
    return id;
}

public ParentObject getParentObject() {
    return parentObject;
}

public String getName() {
    return name;
}

public void setParentObject(ParentObject parentObject) {
    this.parentObject = parentObject;
}
}

但是,我真的不喜欢将 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]
艾伦·海

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有OneToOne关系的实体的JSON输出

来自分类Dev

具有OneToOne关系的实体的JSON输出

来自分类Dev

当所有孩子共享相同的值时查找父母ID

来自分类Dev

Django序列化程序的文件具有OneToOne关系

来自分类Dev

尝试更新或获取具有OneToOne关系的实体时出错

来自分类Dev

播放框架-具有关系OneToOne的更新表

来自分类Dev

选择匹配的孩子父母的所有孩子表ID

来自分类Dev

具有 OneToOne 关系的 Spring Boot 实体中的 JSON 反序列化器?

来自分类Dev

具有仅CascadeType.REMOVE的双向@OneToOne保存更改:不需要

来自分类Dev

休眠-@OneToOne关系

来自分类Dev

选择一个父母和所有给定父母或孩子ID的孩子

来自分类Dev

选择一个父母和所有给定父母或孩子ID的孩子

来自分类Dev

(学说)从孩子到父母加入,其中父母与孩子有 n 关系

来自分类Dev

是否应将仅管理员字段提取到与原始模型具有OneToOne关系的专用模型中?

来自分类Dev

与共享主键和@OneToOne 在子端的单向一对一关系

来自分类Dev

YouTube API获取具有指定ID的视频的共享计数

来自分类Dev

休眠@OneToOne与多个对象的关系?

来自分类Dev

非主键列的OneToOne关系

来自分类Dev

@ManyToOne和@OneToOne与@EmbeddedId的关系

来自分类Dev

如何正确映射OneToOne关系?

来自分类Dev

@ManyToOne和@OneToOne与@EmbeddedId的关系

来自分类Dev

JPA:了解OneToOne双向关系

来自分类Dev

JPA OneToOne关系自动创建

来自分类Dev

Hibernate 4.2,双向@OneToOne和@Id

来自分类Dev

具有重复ID的主干关系集合

来自分类Dev

具有多个ID的多对多关系

来自分类Dev

具有重复ID的主干关系集合

来自分类Dev

@OneToOne与Hibernate共享主键的映射用户-帐户

来自分类Dev

我如何称呼有至少一个孩子关系的孩子的父母?

Related 相关文章

  1. 1

    具有OneToOne关系的实体的JSON输出

  2. 2

    具有OneToOne关系的实体的JSON输出

  3. 3

    当所有孩子共享相同的值时查找父母ID

  4. 4

    Django序列化程序的文件具有OneToOne关系

  5. 5

    尝试更新或获取具有OneToOne关系的实体时出错

  6. 6

    播放框架-具有关系OneToOne的更新表

  7. 7

    选择匹配的孩子父母的所有孩子表ID

  8. 8

    具有 OneToOne 关系的 Spring Boot 实体中的 JSON 反序列化器?

  9. 9

    具有仅CascadeType.REMOVE的双向@OneToOne保存更改:不需要

  10. 10

    休眠-@OneToOne关系

  11. 11

    选择一个父母和所有给定父母或孩子ID的孩子

  12. 12

    选择一个父母和所有给定父母或孩子ID的孩子

  13. 13

    (学说)从孩子到父母加入,其中父母与孩子有 n 关系

  14. 14

    是否应将仅管理员字段提取到与原始模型具有OneToOne关系的专用模型中?

  15. 15

    与共享主键和@OneToOne 在子端的单向一对一关系

  16. 16

    YouTube API获取具有指定ID的视频的共享计数

  17. 17

    休眠@OneToOne与多个对象的关系?

  18. 18

    非主键列的OneToOne关系

  19. 19

    @ManyToOne和@OneToOne与@EmbeddedId的关系

  20. 20

    如何正确映射OneToOne关系?

  21. 21

    @ManyToOne和@OneToOne与@EmbeddedId的关系

  22. 22

    JPA:了解OneToOne双向关系

  23. 23

    JPA OneToOne关系自动创建

  24. 24

    Hibernate 4.2,双向@OneToOne和@Id

  25. 25

    具有重复ID的主干关系集合

  26. 26

    具有多个ID的多对多关系

  27. 27

    具有重复ID的主干关系集合

  28. 28

    @OneToOne与Hibernate共享主键的映射用户-帐户

  29. 29

    我如何称呼有至少一个孩子关系的孩子的父母?

热门标签

归档