• Tag Archives: hibernate

创建一个基于SpringBoot2.1.x的JavaFX程序

1.创建SpringBoot项目

到 https://start.spring.io/ 创建一个SpringBoot2.1.x项目,解压后使用MyEclipse2015导入为maven项目~

2.引入JavaFX

对SpringBoot入口程序Application进行改造,继承javafx的application类,并引入接口CommandLineRunner, Consumer<Stage>,接着加入如下代码(高亮部分):

然后启动,出现如下界面则为成功:

ac571e727fe9d73b3500c54a3e2117c

 

3.增加预加载页面

在pom.xml加入如下依赖:

 

新增一个启动入口文件如MainApplication.java用于展示欢迎界面,代码如下:

在预加载完成后还要再正式界面中隐藏掉本界面,因此要在原来的application类的stage.show()前面加入如下代码:

然后注释掉原来的application启动类中的main方法:

最后启动刚刚新建的MainApplication.java,便会出现中间界面:

d294a0cca4b571832aaa7b9c70f8363

好了,大功告成。如果还需要引入sqlite数据库,则可以继续往下操作。

4.引入hibernate并使用sqlite数据库

在MainApplication中的 下方加入如下代码,以提示sqlite是否存在:

再pom.xml中加入如下依赖:

 

对原来的Application进行修改(加入高亮部分):

增加sqlite的方言类SQLiteDialect.java:

增加配置文件application.properties用于配置数据库(注意高亮行,要指向刚刚创建的方言类SQLiteDialect.java):

好了,运行MainApplication看看效果:

639fccfb32a10d16ee5a29089e0094f

如图所示,输入sessionFactory不为空,则注入成功,后面大家自由发挥吧!

5.补充:记得指定maven打包时的启动入口

在pom.xml中加入如下高亮代码

大功告成!

关于Spring+Hibernate时,packagesToScan无法扫描到jar中实体类的解决办法

由于要做分布式,因此不同的微服务中会用到相同的实体类,因此需要将实体类拿到独立的项目中去,然后生成为jar来被不同的项目引用。

但是问题来了,当我使用MyEclipse进行Export导出成jar,然后由其他微服务引用此jar时,发现hibernate并没有扫描到jar中的实体类。

于是我翻了好多资料,找到以下两种解决办法:

第一种:在配置文件中指定jar中的注解实体类

但是这样做有个缺点,就是无法使用“*”号来进行通配,所以当你有十个类的时候,list中就得有十个value。

第二种(推荐):使用MyEclipse导出公共实体类时,要勾选“Add directory entiriess”

49f3fe9dd03935ab16bbeaa65c80b51

然后在需要引入该jar的项目中重新引入即可。

原因分析:

默认方式生成的jar包中,只含有class文件,而并没有我们大众所知的文件夹目录结构。可能我们大多数人认为com.test.Student类,Student类文件就应该在com文件夹下的test文件夹里,这其实是片面的,是一个误区!

com.test真正的含义是package包域名,就好比.net里的命名空间,它只是为了区分、汇总、唯一标识不同的类而提出的概念,跟文件夹目录层次结构是两回事,我们只是习惯上用文件夹目录来展示package而已。但package却不一定非要用过文件夹目录来展示。

我们可以用下面这段代码来进一步说明这个问题:

默认生成的jar包,运行结果如下:

如果勾选Add directory entries选项生成的jar包,运行结果如下:

这样也就解释了为何打成jar包后用getResource获取资源url总是为空的原因了。

SpringBoot2.1.1整合hibernate5.0.12使用SessionFactory

1、在pom.xml中加入如下依赖:

如果pom.xml中有如下jpa依赖,记得清注释以下内容:

如果出现FilterRegistrationBean报错,则意味着缺少SpringMVC的filter依赖,办法之一是引入含有该filter的依赖(eureka的server依赖也是包含的):

 

2、在application.properties中加入如下配置:

如果在低版本SpringBoot中进行配置,则可能会遇到错误“Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true”,此时则需要在application.properties补充配置:

因为SpringBoot的SessionFactory会自动注入默认的Transactional事务管理器,但这个事务管理器搭配hibernate的SessionFactory会出现数据库连接池线程卡死的问题,即假如配置线程池的连接数为10,一旦连接数大于10,则线程池会出现卡死的情况,因此我们需要自行配置hibernate的事务管理器来覆盖SpringBoot原有的Transactional事务管理器。

3、在SpringBoot的启动入口类上加入注解@ImportResource(“classpath:hibernate.xml”):

4、在resources目录中加入配置文件hibernate.xml:

5、增加事务管理配置,有两种方式,一种是使用SpringBoot的config注入方式,另外一种是加在hibernate.xml中。(记住下面5.1和5.2是二选一)

5.1、使用SpringBoot的confiug注入方式:增加配置文件TransactionAdviceConfig.java:

5.2、加在hibernate.xml中:

 

6、增加事务管理过滤器FilterConfig.java,自动开启事务管理:

7、搞掂,启动项目!在需要使用SessionFactory的地方使用如下方式注入即可:

 

常见问题

重复的依赖错误

错误提示如下:

这很有可能你的依赖中有重复的内容,如:

这个是需要注释掉的,不然会报错。

在SpringBoot中使用SessionFactory的方法

首先项目中已经使用JPA的方式连接,然后加入hibernate依赖:

 

然后有以下几种方式,选择一种合适自己的。

方法一:

增加配置文件HibernateConfig.java:

如果要使用@Transactional则需要在application.properties中加上:

 

方法二:(推荐)

在SpringBoot的启动类中加上:

如果要使用@Transactional则需要在application.properties中加上:

 

 

方法三:

在SpringBoot的启动类中加上:

如果要使用@Transactional则需要在application.properties中加上:

 

 

使用方法:

 

SpringBoot2.0+Hibernate在Controller使用Session并发性能调优

从SpringBoot2.0开始,其DataSource就交给了Hikari负责。

对于高并发需求,根据数据库的性能,若然Controller执行时间过长,过多controller正在等待有限的sessionFactory资源,则会造成线程堵塞,引起雪崩。

需要在springboot的配置中假如如下设置:

最主要是maximum-pool-size参数,在不设置的情况下默认是10,所以当用户卡在controller等待使用session资源时,做并发测试的时候就会出现卡死现象,引起雪崩。

如果controller中关于数据查询的部分的执行时间较长,maximum-pool-size一定要调大,但是这个值越大我猜测就越内存,一定要适当。

close