我有一个拥有实体类,它有一些关联的实体,例如:
@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查询?
经过进一步的调查,我发现如果我将Child
的id
保留为空(即让它自动生成新的id),则只生成INSERT。但是,如果我手动为Child
分配id,则会在INSERT之前生成SELECT。是否有办法为Child
分配id,同时避免额外的SELECT?
1条答案
按热度按时间jv4diomz1#
根据您的代码,我认为由于一对多Map和您没有提供级联类型,所以它不会发生选择查询运行两次提供更多信息实体类属性文件的完整代码