JpaRepository和CrudRepository在使用Spring Data JPA时有什么区别?

9

我正在开发一个使用Spring Boot的应用程序,该应用程序使用Spring Data JPA(基于Hibernate 4)访问我的数据库。

我的疑问与DAO接口有关(由JPA自动生成查询)。

因此,在我的项目中,我有以下两个接口:

1)AccomodationDAO

@Repository
@Transactional(propagation = Propagation.MANDATORY)
public interface AccomodationDAO extends JpaRepository<Accomodation, Long> {

    Accomodation findById(@Param("id") Long id);

}

2) EventDAO:

public interface EventDAO extends CrudRepository<Event, Integer> {

    public Event findByLocation(Point location);

    public Event findById(@Param("id") Integer id);

}

它们都很好用,并且使用相同的逻辑来声明查询。

我的唯一疑问是:第一个扩展了JpaRepository,而第二个实现了CrudRepository

JpaRepositoryCrudRepository之间到底有什么区别?在什么情况下使用哪种方法更好呢?

另一个问题是:为什么我定义的DAO接口要扩展JpaRepositoryCrudRepository这两个本身就是接口的接口?据我所知,接口是被实现而不是被扩展的...我错过了什么吗?


2
请参阅此链接:https://dev59.com/SGYr5IYBdhLWcg3wBlzp。简而言之,它们是相同的,除非您需要特定于JPA的功能,否则请扩展`CrudRepository`。 - kaqqao
1个回答

9
请注意,JpaRepository扩展了CrudRepository。比较这两个接口的JavaDoc: JpaRepository vs CrudRepository 简而言之,JpaRepository:
- 具有额外的JPA特定方法,支持例如按示例查询、分批删除、手动刷新更改到数据库等。 - 查询方法返回List而不是Iterable。
如果您正在使用JPA,则应使用JpaRepository。

1
特别是最后一部分是错误的。务必尽量避免使用特定于存储的接口,因为使用它们会将持久化技术泄漏到客户端中。只有在确实需要调整功能时才应使用特定于存储的接口。有关详细信息,请参见我的其他答案:https://dev59.com/SGYr5IYBdhLWcg3wBlzp#20784007 - Oliver Drotbohm
教训得到了 - 谢谢Oliver - Robert Niestroj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接