Spring JPA为现有拥有实体的新关联实体生成SELECT查询

62o28rlo  于 2023-01-13  发布在  Spring
关注(0)|答案(1)|浏览(164)

我有一个拥有实体类,它有一些关联的实体,例如:

@Entity
public class Parent {
    @Id
    @GeneratedValue
    private UUID id;
    @OneToMany(mappedBy = "parentId", cascade = CascadeType.ALL)
    List<Child> children;
    ...
}

@Entity
public class Child {
    @Id
    @GeneratedValue
    private UUID id;
    private UUID parentId;
    ...
}

我使用的是Sping Boot Starter Data JPA,我追踪代码到SimpleJpaRepository类,我注意到在调用save(parent)时,它检查isNew()是否返回true,Spring将调用persist();这是完全有意义的,因为persist()将只生成一个INSERT,而merge()将生成一个SELECT(如果它以前没有执行过),如果SELECT没有返回任何值,则在后面跟着一个INSERT;否则为UPDATE。
当用新的Child保存新的Parent时,上面的方法很有效,只生成INSERT而不生成SELECT。
然而,我的问题是,当创建一些新的Child并将它们添加到现有的Parent中,然后保存父实体时,不知何故,我注意到Spring JPA仍然在INSERT之前为每个新的Child实体生成一个额外的SELECT,我发现这是不必要的。
是否有办法避免这些SELECT查询?
经过进一步的调查,我发现如果我将Childid保留为空(即让它自动生成新的id),则只生成INSERT。但是,如果我手动为Child分配id,则会在INSERT之前生成SELECT。是否有办法为Child分配id,同时避免额外的SELECT?

jv4diomz

jv4diomz1#

根据您的代码,我认为由于一对多Map和您没有提供级联类型,所以它不会发生选择查询运行两次提供更多信息实体类属性文件的完整代码

相关问题