Jpa与Druid线程池及Spring Boot整合(二): spring-boot-starter-data-jpa 踏坑异常处理方案

                    


 Jpa与Druid线程池及Spring Boot整合(一)

Jpa与Druid线程池及Spring Boot整合(二):几个坑

附录官网文档:core.domain-events域事件


从聚合根发布事件

存储库管理的实体是聚合根。在领域驱动设计应用程序中,这些聚合根通常会发布领域事件。Spring Data 提供了一个名为 的注释@DomainEvents,您可以在聚合根的方法上使用该注释,以使该发布尽可能简单,如以下示例所示:

示例 43. 从聚合根公开域事件
class AnAggregateRoot {@DomainEvents (1)Collection<Object> domainEvents() {// … return events you want to get published here}@AfterDomainEventPublication (2)void callbackMethod() {// … potentially clean up domain events list}
}
使用的方法@DomainEvents可以返回单个事件实例或事件集合。它不能接受任何参数。
发布所有事件后,我们有一个用 注释的方法@AfterDomainEventPublication。您可以使用它来潜在地清理要发布的事件列表(以及其他用途)。

每次调用以下 Spring 数据存储库方法之一时都会调用这些方法:

  • save(…),saveAll(…)

  • delete(…)deleteAll(…)deleteAllInBatch(…),deleteInBatch(…)

请注意,这些方法将聚合根实例作为参数。这就是为什么deleteById(…)明显不存在的原因,因为实现可能会选择发出删除实例的查询,因此我们首先永远无法访问聚合实例。

 


在使用Spring Boot JPA时,open-in-view 选项默认为true。启动时在日志中会出现警告。 

一坑:druid与jpa整合,启动出现如下警告:

JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning

 处理方案:

按照日志要求将 open-in-view=false。再次启动,如果在实体类中外键字段使用了懒加载模式,在视图层中调用数据时,则会出现 no session 异常。

解决方法:手动注册OpenEntityManagerInViewFilter过滤器,改变session的生命周期,当web请求关闭时才结束session。
 


  javaConfig注入bean

@Bean
public FilterRegistrationBean<OpenEntityManagerInViewFilter> registerOpenEntityManagerInViewFilterBean() {FilterRegistrationBean<OpenEntityManagerInViewFilter> registrationBean = new FilterRegistrationBean<>();OpenEntityManagerInViewFilter filter = new OpenEntityManagerInViewFilter();registrationBean.setFilter(filter);registrationBean.setOrder(5);return registrationBean;
}

解疑:

如果使用的是 JPA 则对应OpenEntityManagerInViewFilter,Hibernate对应OpenSessionInViewFilter
疑问:

registrationBean.setOrder(5),order为什么是5
OpenSessionInViewInterceptor&OpenSessionInViewFilter,OpenEntityManagerInViewInterceptor&OpenEntityManagerInViewFilter这几个类的区别以及使的的场景

 


重新启动: 正常:


二坑:   springboot整合JPA出现异常java.lang.IllegalArgumentException: Not a managed type: class xx

方案: 一

启动类或者JavaConfig添加添加扫描实体的路径:
@EntityScan(basePackages = "org.jd.websocket.auth.data.reactor.jpa")
@EnableTransactionManagement // 开启事务的支持
@EnableJpaRepositories(basePackages = {"org.jd.websocket.auth.data.reactor.repository","org.jd.websocket.auth.data.reactor.jpa"},includeFilters = {@ComponentScan.Filter(type = FilterType.REGEX, pattern = ".*CrudRepository")},excludeFilters = {@ComponentScan.Filter(type = FilterType.REGEX, pattern = ".*SomeOtherRepository")})

 方案: 二

@Configuration     javaConfig中注入Bean

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();vendorAdapter.setGenerateDdl(true);LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();factory.setJpaVendorAdapter(vendorAdapter);// entity扫描的包路径factory.setPackagesToScan("org.jd.websocket.auth.data.reactor.jpa");factory.setDataSource(dataSource());return factory;
}

@Value("${spring.datasource.url}")
private String dbUrl;@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.driver-class-name}")
private String driverClassName;@Value("${spring.datasource.initialSize}")
private int initialSize;
@Value("${spring.datasource.minIdle}")
private int minIdle;
@Value("${spring.datasource.maxActive}")
private int maxActive;
@Value("${spring.datasource.maxWait}")
private int maxWait;
@Value("${spring.datasource.timeBetweenEvictionRunsMillis}")
private int timeBetweenEvictionRunsMillis;
@Value("${spring.datasource.minEvictableIdleTimeMillis}")
private int minEvictableIdleTimeMillis;
@Value("${spring.datasource.validationQuery}")
private String validationQuery;
@Value("${spring.datasource.testWhileIdle}")
private boolean testWhileIdle;
@Value("${spring.datasource.testOnBorrow}")
private boolean testOnBorrow;
@Value("${spring.datasource.testOnReturn}")
private boolean testOnReturn;
@Value("${spring.datasource.poolPreparedStatements}")
private boolean poolPreparedStatements;
@Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}")
private int maxPoolPreparedStatementPerConnectionSize;
@Value("${spring.datasource.filters}")
private String filters;
@Value("{spring.datasource.connectionProperties}")
private String connectionProperties;@Bean
@Primary
public DataSource dataSource() {DruidDataSource datasource = new DruidDataSource();datasource.setUrl(dbUrl);datasource.setUsername(username);datasource.setPassword(password);datasource.setDriverClassName(driverClassName);// configurationdatasource.setInitialSize(initialSize);datasource.setMinIdle(minIdle);datasource.setMaxActive(maxActive);datasource.setMaxWait(maxWait);datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);datasource.setValidationQuery(validationQuery);datasource.setTestWhileIdle(testWhileIdle);datasource.setTestOnBorrow(testOnBorrow);datasource.setTestOnReturn(testOnReturn);datasource.setPoolPreparedStatements(poolPreparedStatements);datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);try {datasource.setFilters(filters);} catch (SQLException e) {System.err.println("druid configuration initialization filter: " + e);}datasource.setConnectionProperties(connectionProperties);return datasource;
}@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();vendorAdapter.setGenerateDdl(true);LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();factory.setJpaVendorAdapter(vendorAdapter);// entity扫描的包路径factory.setPackagesToScan("org.jd.websocket.auth.data.reactor.jpa");factory.setDataSource(dataSource());return factory;
}

坑三:    多数据源注入,事务失效|解决方案;

* @Transactiona在多数据源下失效
* 在多数据源的情况下,如果transactionManager进行了分开配置,比如这里针对三个数据源配置了三个transactionManager
* ===========================================================================================================
* @Bean("formTransactionManager")
* public PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder) {
*     return new JpaTransactionManager(Objects.requireNonNull(entityManagerFactory(builder).getObject()));
* }
*=============================================================================================================
* @Bean("fileTransactionManager")
* public PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder) {
*     return new JpaTransactionManager(Objects.requireNonNull(entityManagerFactory(builder).getObject()));
* }
* ============================================================================================================
* @Primary
* @Bean("userTransactionManager")
* public PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder) {
*     return new JpaTransactionManager(Objects.requireNonNull(entityManagerFactory(builder).getObject()));
* }
* =============================================================================================================
*
* 那么在使用@Transactional的时候需要指定transactionManager
* @Transactional("formTransactionManager")

@EnableTransactionManagement // 开启事务的支持

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1379688.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

pass 软件_PASS软件非劣效Logrank检验的h1参数如何设置?

前言 近日&#xff0c;有朋友在《统计咨询》公众号咨询&#xff1a;在使用PASS中的Non-Inferiority Logrank Tests程序计算样本量时&#xff0c;h1(Hazard Rate of Reference Group) 这个参数不懂得如何设置&#xff1f;见下图红色矩形标注的参数。相信这个也是其他很多朋友碰…

简单聊聊什么是Sass、Pass和Iass?

Iass&#xff0c;Pass和Saas都是什么意思&#xff1f;想必大家都听过也查阅过资料。但现在网上很多文章都会把一些比较简单的概念包装得非常牛气&#xff0c;逼格很高&#xff0c;各种高大上就是不说大白话&#xff0c;本文正好通过搭建网校平台为例和小伙伴简单分享一下它们之…

项目如何简单的使用pass平台部署服务

目录 前言&#xff1a; 一&#xff1a;Pass平台的优势 二&#xff1a;Pass平台的相关要素 三&#xff1a;docker|jenkins\k8s\pass\git之间关系 四&#xff1a;项目如何使用pass 五&#xff1a;pass平台常规操作 5.1应用重启 5.1.1定位到命名空间下的容器项目 5.1.2服务…

云计算之IasS、PasS、SaaS

越来越多的软件&#xff0c;开始采用云服务。 云服务只是一个统称&#xff0c;可以分成三大类。 IaaS&#xff1a;基础设施服务&#xff0c;Infrastructure-as-a-servicePaaS&#xff1a;平台服务&#xff0c;Platform-as-a-serviceSaaS&#xff1a;软件服务&#xff0c;Softw…

pass平台的搭建

Docker容器化部署Rancher CentOS 7.0默认使用的是firewall作为防火墙 查看防火墙状态 firewall-cmd --state ​ 停止firewall systemctl stop firewalld.service ​ 禁止firewall开机启动 systemctl disable firewalld.service ​ 安装rancher docker run -d --restart=unless-…

pass,saas区别

毫无疑问&#xff0c;PaaS与企业在服务与开发过程中的需求密切相关&#xff0c;特别是随着云计算的发展和企业平台化战略的驱动&#xff0c;企业对于云原生应用和全新的应用开发都提出了更高要求&#xff0c;而PaaS作为“承上启下”的中间层也变得越来越重要&#xff0c;更成为…

saas,pass介绍

毫无疑问&#xff0c;PaaS与企业在服务与开发过程中的需求密切相关&#xff0c;特别是随着云计算的发展和企业平台化战略的驱动&#xff0c;企业对于云原生应用和全新的应用开发都提出了更高要求&#xff0c;而PaaS作为“承上启下”的中间层也变得越来越重要&#xff0c;更成为…

Saas、Pass和lass

lass&#xff1a;需要将源码系统署到服务器上才能让大家访问&#xff0c;那服务器从哪来&#xff0c;咱们可以单独买一台实体服务器放家里放公司里&#xff0c;但是这样成本会比较高&#xff0c;而且维护会比较麻烦&#xff0c;所以更方便的方式就是去云服务平台&#xff0c;租…

SaaS,iass 和pass,你知道吗?

一、IaaS IaaS是Infrastructure as a server的缩写&#xff0c;意思是基础设施即服务。又云端公司把IT环境的基础设施建设好&#xff0c;然后直接对外出租硬件服务器或者虚拟机。消费者可以利用所有计算基础设施&#xff0c;包括处理CPU、内存、存储、网络和其它基本的计算资源…

saas和pass的区别

毫无疑问&#xff0c;PaaS与企业在服务与开发过程中的需求密切相关&#xff0c;特别是随着云计算的发展和企业平台化战略的驱动&#xff0c;企业对于云原生应用和全新的应用开发都提出了更高要求&#xff0c;而PaaS作为“承上启下”的中间层也变得越来越重要&#xff0c;更成为…

云计算的服务:Iass,Pass,Sass,Cass,Pass 区别及应用

一、什么是云计算 云计算&#xff08;cloud computing&#xff09;是基于互联网的相关服务的增加、使用和交付模式&#xff0c;通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源。云是网络、互联网的一种比喻说法。云计算甚至可以让你体验每秒10万亿次的运算能力&…

​LeetCode解法汇总1572. 矩阵对角线元素的和

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 给你一个正…

saas和pass

毫无疑问&#xff0c;PaaS与企业在服务与开发过程中的需求密切相关&#xff0c;特别是随着云计算的发展和企业平台化战略的驱动&#xff0c;企业对于云原生应用和全新的应用开发都提出了更高要求&#xff0c;而PaaS作为“承上启下”的中间层也变得越来越重要&#xff0c;更成为…

Pass框架

/include/llvm/Pass.h Pass框架是LLVM系统中一个重要的部分&#xff0c;Pass类是实现代码优化的主要资源&#xff0c;每个pass是LLVM系统进行转化和优化工作的一个节点&#xff0c;可以完成特定的优化工作&#xff0c;多个pass可共同完成优化和转化。 Pass分类 从代码结构上来…

Android cts all pass 全攻略

android CTS ! Goodbye fails ! Goodbye timeout ! ✿为什么要进行cts测试 Android兼容性测试(CTS)和连带的兼容性定义文档(CDD),是一个确保终端设备与特定版本Android兼容的自管理程序。CTS测试集包含大约24,000个在Android设备上运行的测试用例,这些用例分别针对电话、…

研究生课程笔记:软件包在流行病学中的应用(一)——PASS软件

本博客旨在记录研究生软件包课程&#xff0c;大多为个人后续学习所用&#xff0c;非专业。 可能有理解不当或相对浅薄之处&#xff0c;欢迎批评指正。关键词&#xff1a;功效&#xff0c;样本量&#xff0c;流行病学常见研究类型&#xff0c;PASS软件使用 一、流行病学基础知识…

样本量计算PASS软件提高临床研究可靠性的利器

临床研究样本量的计算是医学研究中非常重要的一步&#xff0c;正确的样本量计算可以提高研究的可靠性和准确性。PASS是一款广泛应用的临床研究样本量计算软件&#xff0c;该软件以其简单易用、功能齐全和准确性高等特点而受到广泛的欢迎和使用。在本文中&#xff0c;我们将详细…

【1289. 下降路径最小和 II】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个 n x n 整数矩阵 grid &#xff0c;请你返回 非零偏移下降路径 数字和的最小值。 非零偏移下降路径 定义为&#xff1a;从 grid 数组中的每一行选择一个数字&#xff0c;且按顺序选出来的数…

​docker复现Nginx配置漏洞​

目录 1.docker环境搭建 2.复现过程 2.1CRLF(carriage return/line feed)注入漏洞 ​编辑 2.2.目录穿越 2.3.add_header覆盖 1.docker环境搭建 1.安装docker Debian系列 apt-get update apt-get install docker.io Redhat系列 yum install docker.io 2.下载并解压dock…

如何用柔和的方法提高QQ浏览器打开网页的速度

首先看图片&#xff0c;已经等了2分钟了 然后我去问了下运营商 竟然只花了几秒… 然后我发现了一个重大事情&#xff01; 查看了浏览器内存使用情况 找到了这个方法 1、打开浏览器&#xff0c;选择&#xff1a;设置 – Internet选项 – 连接 – 若“拨号和虚拟网络设置”下…