当前位置: 首页 > 知识库问答 >
问题:

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

陈斌
2023-03-14

我使用的是Spring数据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;
    }

}

父实体已经在数据库中,所以我直接找到它,父存储库entends Jpa列举
这里是我的测试代码:

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仍然为空,如何在保存父代后获取子代的id?因为我创建的子对象被其他对象引用,所以我需要获取这个子对象的id,而不是从数据库中找到一个新对象。

共有2个答案

车诚
2023-03-14

根据代码,您已经创建了childObject,并且没有为其元素设置任何值,然后尝试从新创建的对象(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
柯昆杰
2023-03-14

您必须使用保存方法中的返回值:

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
 类似资料:
  • 我正在尝试开发一个小型电子商务项目。我有一个篮子和篮子项目实体。我只是想当我为客户保存购物篮时,我想把购物篮项目保存在数据库中。我认为我不应该为篮子项目创建存储库。我应该能够保存篮子项目,同时使用篮子存储库保存篮子。 在这里,我试图通过篮子服务获得一个篮子项目,并将其设置为篮子实体并保存它。 我有什么问题?我有个例外。

  • Javers v5.6.3 我有一个父实体,其中包含一系列子实体。当我区分两个父母列表,发现一个孩子有变化时,我需要知道哪个父母包含变化的孩子。 我的实体: 我想要区分的是: 为了简洁起见,切换到Groovy: 我是如何区分的: 输出: 我的问题是: 如何发现哪个父级包含子级/c1? 除了我有一个老板集合之外,这类似于应该检测薪酬变化()示例。使用该示例,给定具有不同下属的老板列表,如何找出的老板

  • 我将JPA2与Hibernate一起使用。有两个实体类,和。最后一个是第一个的继承实体。使用SINGLE_TABLE继承策略。当我尝试通过从id=“123456”的CardElement中查询

  • 我正在从经典Spring 4.3.2 Hibernate(HQL)迁移到Spring Boot 1.4.1 Hibernate(JPA)HikariCP连接池,并且在批量插入方面遇到问题。我需要保存1000到527 000个元素的大列表。 当我只保存一个实体的批次,没有任何依赖项(例如:类的5000个元素)时,一切都很好。 但是,如果我尝试同时保存子实体和父实体(只需为其设置),我会得到例外: 但

  • 我有一些关于“级联”的问题,在我的项目中,我有类别类,每个类可以是父类或子类。但我在同一个类中定义了哪一个是父母还是孩子。父母和孩子之间存在一对多的关系。这是我的实体类 我的问题是;当我删除子类别时,它的成功并没有问题。如果父类别有子类别,则无法删除父类别。 错误消息; Servlet.service()的servlet[调度Servlet]在上下文中与路径[]抛出异常[请求处理失败;嵌套异常or

  • 我对Spring和JPA等比较陌生。我试图在标签和客户之间建立一种多对多的关系(双向) 我想我的关系是对的。除了一个问题外,一切都很好。标记值保存到数据库后为“Null”。 因此,我要做的是——向客户添加一个新的标签列表,然后在保存客户时使用级联选项来保存它。在调用CustomerRepository之前,我设置了一个调试点。保存(customer),标记都有值。在保存操作(在客户存储库上)后,我