使用级联保存父实体时,如何获取子实体ID

时间:2019-07-16 08:21:01

标签: java spring-data-jpa

我正在使用spring-data-jpa。将子级添加到父级实体后,我将父级保存到数据库中。我想得到孩子的身份证,但发现我得到的是空值。

我在getId()方法中添加了@GeneratedValue(strategy = GenerationType.IDENTITY),但是没有用。

这是型号:

@Entity
public class Parent {

    private Integer id;
    private List<Child> childList;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer getId() {
        return id;
    }

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "parent_id")
    public List<Child> getChildList() {
        return childList;
    }

    // setters.....

}

@Entity
public class Child {

    private Integer id;
    private String name;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer getId() {
        return id;
    }

    @Cloumn("name")
    public String getName() {
        return name;
    }

}

父实体已经在数据库中,所以我直接找到它,ParentRepository引用了JpaReportory
这是我的测试代码:

Parent parent = parentRepository.findById(1);
Child child = new Child();
child.setName("child");
parent.getChildList().add(child);
parentRepository.save(parent);

System.out.println("child's id: " + child.getId());

我得到的输出是:

child's id: null

孩子被保存到数据库并具有ID,但是内存中实体的ID仍然为null,在保存父对象之后如何获得孩子的ID?而且由于我创建的子对象被其他对象引用,因此我需要在该子对象中获取ID,而不是从数据库中查找新对象。

2 个答案:

答案 0 :(得分:1)

您必须使用save方法返回的值:

Parent parent = parentRepository.findById(1);
Child child = new Child();
parent.getChildList().add(child);
parent = parentRepository.save(parent); <---------- use returned value with ids set

System.out.println("child's id: " + parent.getChildList().get(0).getId()); <-- access saved child through parent list

答案 1 :(得分:0)

根据代码,您已创建child对象,并且未为其元素设置任何值,然后尝试从新创建的对象(child.getId())中获取元素 除非您从数据库为其分配值,否则它将一直为空。

Parent parent = parentRepository.findById(1);
Child child = new Child(); // Empty child object created
parent.getChildList().add(child);
parentRepository.save(parent);

System.out.println("child's id: " + child.getId()); //Referring empty child object

在这里您可以做的是:
在第五行,我们已经将dB值赋予它

Parent parent = parentRepository.findById(1);
Child child = new Child(); // Empty child object created
parent.getChildList().add(child);
parent = parentRepository.save(parent);
child = parent.getChildList().get(0);// assing db value to it( assingning 1st value of `ChildList`)
System.out.println("child's id: " + child.getId()); //now Referring non-empty child object