我写了两个实体类,A, B,其中A和B是一对多的关系,A类和C类也有主外键关联。如下
A类:
@Entity
public class A implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GenericGenerator(name = "idGenerator", strategy = "uuid")
@GeneratedValue(generator = "idGenerator")
private String id;
@Column(nullable = false)
@NotBlank
private String name;
@ManyToOne
@JoinColumn(name = "cId", referencedColumnName="id")
private C c;
}
B类:
@Entity
public class B implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GenericGenerator(name = "idGenerator", strategy = "uuid")
@GeneratedValue(generator = "idGenerator")
private String id;
@Column(nullable = false)
@NotBlank
private String name;
@ManyToOne
@JoinColumn(name = "aId", referencedColumnName="id")
private A a;
}
在做查询的时候,BRepository.findOne(id) 的执行速度非常慢,大概要6s,但是用BRepository.findFirstById(id) 就快很多,大概是100ms。
其中ARepository.findOne(id)执行也很快,300ms左右,我觉得应该是B实体类的问题,会不会是因为B关联A,但是A又关联C,导致B里面有多重关联。可是不明白findOne为什么比findBy这种要慢那么多。求大神指教
你好,部分历史信息中存在他们的对比描述
Spring Data JPA 之 getOne() 和 findOne() 的区别 简易版
spring-data-jpa中findOne与getOne的区别 详细版
目前我在项目中用SpringBoot2.0与Java8时,findOne其实已经被修改了
现在findOne是将找到一个QueryByExampleExecutor接口中定义的方法,
最后通过接口SimpleJpaRepository的默认实现来CrudRepository实现。
此方法是通过示例搜索查询,不希望你将其作为替换。
实际上,具有相同行为的方法仍然存在于新API中,但方法名称已更改。
它是从更名findOne()到findById()的CrudRepository接口:
你可以通过findById(id).get()来获取具象化对象。
通常,当您按ID查找实体时,如果未检索到该实体,则要返回该实体或进行特定处理。
这里有两个经典的用例。
1)假设如果找不到实体,则要抛出异常,否则要返回它。
你可以写:
2)假设您要根据是否找到实体来应用不同的处理(无需抛出异常)。
你可以写: