Java持久性API规定必须通过EntityManager执行操作数据库实体,并且我们看到JPA中存储库的所有实现类都是SimpleJparePository。当真实时,它将调用EntityManager中的方法。
我们在SimpleJparePository中设置了一个断点,可以轻松地看到EntityManger是JPA接口协议,其现有类是Hibernate中的SessionImpl。如下图所示::
然后,让我们看一下EntityManager为我们提供了哪些方法。
什么是EntityManager方法?这里有一些重要且更常用的方法。如果您不通常使用它,我会带上它。如果您有兴趣,可以自己查看。
那么现在您怎么知道这些语法?
如何使用EntityManager?它易于使用。只要我们可以在任何地方获取EntityManager,我们就可以执行内部操作。
如何获得EntityManager:通过@PersisTenceContext注释。
@persistenceContext注释在EntityManager字段上标记,因此获得的EntityManager是由容器管理的EntityManager。由于它由容器管理,我们不需要或应明确关闭进入入口EntityManager实例。
以下是此方法的示例。我们希望在测试类中让EntityManager获取@persistenceContext,以查看应如何编写代码。
通过此测试案例,我们可以知道EntityManager仍然更易于使用。但是,在实际工作中,我不建议直接使用操作EntityManager,因为如果您不熟练,会有一些异常的交易。因此,我仍然建议这样做。您将Spring Data JPA提供给我们的存储库。它的提示是,当您编写框架时,您可以直接操作EntityManager。请记住,不要在任何业务代码中使用EntityManager,否则最终将难以维护您的代码。
EntityManager我们已经完成了理解,所以让我们看一下@enablejparepositories,它对自定义存储库有什么作用。
@enablejparepositories详细介绍了@enablejparepositories的语法及其默认加载方法的详细说明。
@enablejparepositories,我们仍然直接查看代码,如下所示:
让我对内部的10种方法进行具体解释:
1)价值等于basepackage
用于配置存储库所在的位置的软件包和子包装。
可以配置为单个字符串。
也可以将其配置为字符串号数组表单,即多种情况。
默认@springbootapplication注释出现目录及其sub -directory。
2)basepackageclasses
指定存储库类的位置,您可以替换basepackage的使用。
您也可以成为一个角色。下面的示例表明,BookRepoSitoSitosss所在的软件包下方的所有存储库将扫描和注册。
您也可以拥有多个字符。以下示例表示shoprepository.class,andymanrepository.class的包装下的所有存储库。
指定包含过滤器的过滤器,过滤器使用ComponentScan过滤器,该过滤器可以指定过滤器类型。
以下示例表明仅扫描存储库注释类别。
4)排除滤波器
指定不包括过滤器,并且过滤器也是Componentscan滤波器中的类。
下面的示例表明,具有@service和@controller注释的类无需扫描,当我们的项目变大时,我们可以加快应用程序的启动速度。
5)RepositoryImplementationPostFix
当我们自定义存储库时,接口存储库的实现类的后缀是什么,默认值是imph。示例我将在下面详细说明。
6)名称QuermeRiesLocation
命名SQL的位置,默认为meta-inf/jpa-named-queries.properties
示例如下:
您知道这一点,我建议不要使用它,因为它功能强大,但是当我们使用如此复杂的方法时,您需要考虑是否有一种简单的方法。
7)QueryLookupStrategy
建立条件查询的搜索策略,包括三种方法:创建,use_declared_query,create_if_not_found。
创建:根据接口名称自动构造查询方法,即我们前面提到的定义查询方法;
use_declared_query:@query;查询;
create_if_not_found:如果您有@Query注释,请先盛行;如果您不工作,请使用定义查询方法;我们知道,这是默认的,基本上没有修改。
8)RepositorityFactoryBeanClass
指定生产存储库的工厂类,默认JParePositoryFactoryBean。JParePositoryFactoryBean的主要角色是生成一个实现类,以帮助我们在动态代理中帮助我们的所有存储库接口。例如SimpleJparePository的代理对象,该工厂干燥。通常,我们很少改变这一代理的机制。
9)EntityManagerFactoryRef
哪个工厂类用于指定EntityManager的创建和生产,默认值是名称=“ EntityManagerFactory”的BEAN。
10)课> repositorityBaseclass()
我们的自定义存储库的实现类是什么。默认值是DefaultrepositoryBaseclass,这意味着没有指定的存储库实现基类。
11)字符串TransActionManagerRef()默认的“ TransActionManager”
哪个类用于指定默认事务处理,默认值是TrassActionManager,通常用于多个数据源。
以上是@enablejparepositories的基本语法。涉及更多方法,您可以慢慢探索。LET看一下如何加载默认值。
定义您自己的存储库的实现。有两种方法。
第一个方法:IMPH实现类定义独立存储库。让我们通过一个示例来解释。
步骤1:定义自定义的使用权界接口。
该界面将由@enablejparepositories扫描。代码如下:
步骤2:创建一个自定义Userreposimpl实现类。
实施类使用了我们上面提到的结局,如下所示:
其中,我们还发现了第二种EntityManager的方法,该方法直接放置在构造函数中,并自动注入弹簧。
步骤3:使用UserRepository时,它可以直接继承我们的自定义Userrepository接口。
步骤4:编写测试案例以进行测试。
最后,刚刚调用逻辑删除方法,逻辑删除,运行测试用例,结果将完全传递。