了解 Spring 数据接口
Understanding Spring Data interfaces
我对一些基本的 Spring 数据概念有点困惑。
据我所知,典型的 DAO 级别结构如下所示:
- dao
- MyFirstObjectDao
- MySecondObjectDao
- jpa
- MyFirstObjectDaoImpl
- jdbc
- MySecondObjectDaoImpl
有了这个概念,我可以使用 JPA 作为我的第一个 DAO 接口的实现,JDBC - 第二个。
现在我想了解 Spring 存储库抽象。每个 Spring 数据教程都指定我应该有一个接口,例如应该从 JpaRepository 扩展。所以有了这个界面,我已经锁定了 JPA,对吧?
如果我想提供不同的实现,比如 DAO 中的 jpa/jdbc 怎么办?
通常没有很好的理由想要将 JPA 和 JDBC 持久性混合用于相同的对象;如果您已经将所有内容都注释为 JPA 实体,那么您不妨在所有地方都使用相同的持久性设置。你应该重新考虑一下你为什么要这样做。
也就是说,如果您真的需要,您可以这样做:
interface FooBaseRepository extends PagingAndSortingRepository<Long, Foo> {}
interface FooJpaRepository extends FooBaseRepository, JpaRepository<Long, Foo> {}
interface FooJdbcRepository extends FooBaseRepository, JdbcRepository<Long, Foo> {}
@Autowired FooBaseRepository surpriseRepository
更新: 如果您只是在谈论对不同的类(没有关系)使用不同的持久化策略,没有什么特别复杂的。您可以混合使用 Jpa
和 Jdbc
存储库;它们只是接口。
我对一些基本的 Spring 数据概念有点困惑。
据我所知,典型的 DAO 级别结构如下所示:
- dao
- MyFirstObjectDao
- MySecondObjectDao
- jpa
- MyFirstObjectDaoImpl
- jdbc
- MySecondObjectDaoImpl
有了这个概念,我可以使用 JPA 作为我的第一个 DAO 接口的实现,JDBC - 第二个。
现在我想了解 Spring 存储库抽象。每个 Spring 数据教程都指定我应该有一个接口,例如应该从 JpaRepository 扩展。所以有了这个界面,我已经锁定了 JPA,对吧?
如果我想提供不同的实现,比如 DAO 中的 jpa/jdbc 怎么办?
通常没有很好的理由想要将 JPA 和 JDBC 持久性混合用于相同的对象;如果您已经将所有内容都注释为 JPA 实体,那么您不妨在所有地方都使用相同的持久性设置。你应该重新考虑一下你为什么要这样做。
也就是说,如果您真的需要,您可以这样做:
interface FooBaseRepository extends PagingAndSortingRepository<Long, Foo> {}
interface FooJpaRepository extends FooBaseRepository, JpaRepository<Long, Foo> {}
interface FooJdbcRepository extends FooBaseRepository, JdbcRepository<Long, Foo> {}
@Autowired FooBaseRepository surpriseRepository
更新: 如果您只是在谈论对不同的类(没有关系)使用不同的持久化策略,没有什么特别复杂的。您可以混合使用 Jpa
和 Jdbc
存储库;它们只是接口。