春季启动JPA实体OneToOne添加与父级相关的新子级

时间:2018-10-10 03:38:10

标签: java spring hibernate spring-boot jpa

我无法弄清楚如何简单地将子实体与现有父实体相关联。

@Entity
@Table(name = "parent")
@Document(indexName = "parent")
public class Parent implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

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

    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(unique = true)
    private Child child;

    //getters, setters
 }

孩子

@Entity
@Table(name = "child")
@Document(indexName = "child")
public class Child implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

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

    @OneToOne(mappedBy = "child")
    private Parent parent;

    //getters, setters
 }

这是两个基本模型。

父级已经存在于数据库中,我想添加一个新的子级。

Child childEntity = childRepository.save(child);

该子项的填充如下: child.json

{
   "name": "smallChild", 
   "parent": { "id" : "1" } 
}

我希望能够保存孩子,并使其自动与父母有关系。

我做了一些非常讨厌的代码...

  1. 保存没有父母的孩子作为ID
  2. 通过ID查询数据库中的父对象
  3. 将子级设置为父级实体
  4. 与新孩子一起保存父母
  5. 将父实体设置为子实体
  6. 将孩子与父母同住。

最终是6位数的数据库查询。

我尝试观看lynda.com的一些课程视频,但没有帮助。

谢谢!

1 个答案:

答案 0 :(得分:0)

父级主键或完整的实体都是必需的。 如果父级的ID可用,那么如果目标只是保存,则不需要为获取父级对象而进行的额外查询。

如果您拥有父母的ID,则可以将子实体另存为:

Child child = new Child();
//...
//Setters for child
//...
//Now just create a parent object and set the id to it
Parent p = new Parent();
p.SetId(parentId); // as the parentId is already vailable
child.setParent(p);
Child childEntity = childRepository.save(child);