spring从3.1.0升级到4.2.7

【Elasticsearch专栏 16】深入探索:Elasticsearch的Master选举机制及其影响因素分析 Elasticsearch的Master选举机制是其分布式架构的基石,确保集群高可用性和数据一致性。通过多数派协议,节点间交换信息并投票选举Master,以维护集群状态和处理请求。该机制自动处理故障转移,保障服务连续性。 阅读详情

项目有一个表由于业务猛增,需要分表,分表之后就必然用到动态查询表。

项目框架为spring+springMVC+hibernate,通过重写hibernate拦截器EmptyInterceptor可以实现动态表映射。因为spring-orm还用的是3.1.0,它的LocalSessionFactoryBean不支持entityInterceptor属性,因此需要升级spring版本到4.x,这次按照网上的方法升级到了4.2.7。

1 spring依赖

<properties>  
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
        <jackson.version>2.5.1</jackson.version>  
        <spring.version>4.2.7.RELEASE</spring.version>  
        <spring-security.version>3.0.5.RELEASE</spring-security.version>  
        <hibernate.version>4.3.8.Final</hibernate.version>  
</properties>  
  
 <dependencies>  
<dependency>  
            <groupId>org.springframework</groupId>  
            <artifactId>spring-core</artifactId>  
            <version>${spring.version}</version>  
            <exclusions>  
                <exclusion>  
                    <groupId>commons-logging</groupId>  
                    <artifactId>commons-logging</artifactId>  
                </exclusion>  
            </exclusions>  
        </dependency>  
        <dependency>  
            <groupId>org.springframework</groupId>  
            <artifactId>spring-beans</artifactId>  
            <version>${spring.version}</version>  
        </dependency>  
        <dependency>  
            <groupId>org.springframework</groupId>  
            <artifactId>spring-context</artifactId>  
            <version>${spring.version}</version>  
        </dependency>  
        <dependency>  
            <groupId>org.springframework</groupId>  
            <artifactId>spring-context-support</artifactId>  
            <version>${spring.version}</version>  
        </dependency>  
        <dependency>  
            <groupId>org.springframework</groupId>  
            <artifactId>spring-aop</artifactId>  
            <version>${spring.version}</version>  
            <exclusions>  
                <exclusion>  
                    <groupId>commons-logging</groupId>  
                    <artifactId>commons-logging</artifactId>  
                </exclusion>  
            </exclusions>  
        </dependency>  
        <dependency>  
            <groupId>org.springframework</groupId>  
            <artifactId>spring-tx</artifactId>  
            <version>${spring.version}</version>  
        </dependency>  
        <dependency>  
            <groupId>org.springframework</groupId>  
            <artifactId>spring-test</artifactId>  
            <version>${spring.version}</version>  
        </dependency>  
        <dependency>  
            <groupId>org.springframework</groupId>  
            <artifactId>spring-orm</artifactId>  
            <version>${spring.version}</version>  
        </dependency>  
        <dependency>  
            <groupId>org.springframework</groupId>  
            <artifactId>spring-jdbc</artifactId>  
            <version>${spring.version}</version>  
        </dependency>  
        <dependency>  
            <groupId>org.springframework</groupId>  
            <artifactId>spring-oxm</artifactId>  
            <version>${spring.version}</version>  
        </dependency>  
        <dependency>  
            <groupId>org.springframework</groupId>  
            <artifactId>spring-web</artifactId>  
            <version>${spring.version}</version>  
        </dependency>  
        <dependency>  
            <groupId>org.springframework</groupId>  
            <artifactId>spring-webmvc</artifactId>  
            <version>${spring.version}</version>  
        </dependency>  
  <!-- jackson json -->  
<dependency>  
    <groupId>com.fasterxml.jackson.core</groupId>  
    <artifactId>jackson-core</artifactId>  
    <version>${jackson.version}</version>  
</dependency>  
<dependency>  
    <groupId>com.fasterxml.jackson.core</groupId>  
    <artifactId>jackson-databind</artifactId>  
    <version>${jackson.version}</version>  
</dependency>  
<dependency>  
    <groupId>com.fasterxml.jackson.core</groupId>  
    <artifactId>jackson-annotations</artifactId>  
    <version>${jackson.version}</version>  
</dependency>  
<dependency>  
    <groupId>com.fasterxml.jackson.module</groupId>  
    <artifactId>jackson-module-jaxb-annotations</artifactId>  
    <version>${jackson.version}</version>  
</dependency>  
</dependencies>   

项目里还用到了spring-security,本来想一起升级,但是改动太大,最后还是沿用了之前的版本,等以后有时间再研究一下。

注意:这里需要把jackson也升级。

2 修改springmvc.xml,使用MappingJackson2HttpMessageConverter代替MappingJacksonHttpMessageConverter,MappingJackson2JsonView代替MappingJacksonJsonView。

3 修改spring.xml,在LocalSessionFactoryBean中加入entityInterceptor属性。

<!-- 配置sessionFactory -->  
   <bean id="sessionFactory"  
         class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">  
       <property name="dataSource" ref="dataSource"/>  
       <property name="namingStrategy">  
           <bean class="org.hibernate.cfg.ImprovedNamingStrategy"/>  
       </property>  
       <property name="entityInterceptor">  
           <bean class="com.eversec.base.base.BaseInterceptor"/>  
       </property>  
<property name="packagesToScan" value="com.eversec"/><!-- 如果多个,用“,”分隔 -->  
lt;property name="hibernateProperties">  
           <props>  
               <!-- 链接释放策略 on_close | after_transaction | after_statement | auto  -->  
               <prop key="hibernate.connection.release_mode">after_transaction</prop>  
  
               <prop key="current_session_context_class">  
                   org.springframework.orm.hibernate4.SpringSessionContext  
               </prop>  
               <prop key="hibernate.dialect">${hibernate.dialect}</prop>  
               <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>  
               <prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</prop>  
               <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>  
               <prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop>  
               <prop key="hibernate.connection.release_mode">after_transaction</prop>  
               <prop key="transaction.auto_close_session">false</prop>  
               <prop key="connection.autocommit">false</prop>  
           </props>  
       </property>  
   </bean>  

4 下面就是重写的hibernate拦截器

package com.eversec.base.base;  
  
import org.hibernate.EmptyInterceptor;  
  
/** 
 * 重写Hibernate拦截器 
 * 实现动态替换表名和添加时忽略重复记录 
 * 
 * @author gb 
 * @version 2015-01-13 
 */  
public class BaseInterceptor extends EmptyInterceptor {  
  
    private static final long serialVersionUID = 1L;  
  
  
    /** 
     * 动态替换表名 
     */  
    public static final String REPLACE_TABLE_NAME = "replace_table_name";  
    /** 
     * insert时添加ignore 
     */  
    public static final String ADD_IGNORE = "add_ignore";  
    /** 
     * insert时添加ignore并动态替换表名 
     */  
    public static final String ADD_IGNORE_AND_REPLACE_TABLE_NAME = "add_ignore_replace_table_name";  
  
    // 使用ThreadLocal存放日期,保证每个线程取到自己需要动态替换表命的日期  
    private static ThreadLocal<String[]> thread = new ThreadLocal<String[]>();  
  
    /** 
     * 存放SQL替换内容 
     * 
     * @param contents [0]关键词,[1]被替换内容,[2]替换内容<br> 
     *                 1)关键词replace_table_name,替换表名<br> 
     *                 2)关键词add_ignore,insert into时添加ignore<br> 
     *                 3)关键词add_ignore_replace_table_name,insert into时添加ignore并替换表名<br> 
     */  
    public static void replace(String... contents) {  
        thread.set(contents);  
    }  
  
    /** 
     * SQL替换内容 
     * <p> 
     * [0]关键词,[1]被替换内容,[2]替换内容<br> 
     * 1)关键词replace_table_name,替换表名<br> 
     * 2)关键词add_ignore,insert into时添加ignore<br> 
     * 3)关键词add_ignore_replace_table_name,insert into时添加ignore并替换表名<br> 
     * 4)替换内容为空时,不处理SQL并返回 
     * </p> 
     */  
    public String onPrepareStatement(String sql) {  
        String[] contents = thread.get();  
        if (contents == null || contents.length < 1) {  
            return sql;  
        }  
  
        if (contents[0].equals(REPLACE_TABLE_NAME)) {  
            sql = replaceTableName(sql, contents[1], contents[2]);  
        } else if (contents[0].equals(ADD_IGNORE)) {  
            sql = addIgnore(sql);  
        } else if (contents[0].equals(ADD_IGNORE_AND_REPLACE_TABLE_NAME)) {  
            sql = addIgnoreAndReplaceTableName(sql, contents[1], contents[2]);  
        }  
  
        thread.remove();  
        //System.out.println(sql);  
        return sql;  
    }  
  
    // 动态替换表名  
    private String replaceTableName(String sql, String oldContent,  
                                    String replaceContent) {  
        sql = sql.replaceAll(oldContent, replaceContent);  
        return sql;  
    }  
  
    // insert忽略重复记录  
    private String addIgnore(String sql) {  
        sql = sql.replaceAll("insert into", "insert ignore into");  
        return sql;  
    }  
  
    // insert忽略重复记录同时替换表名  
    private String addIgnoreAndReplaceTableName(String sql, String oldContent,  
                                                String replaceContent) {  
        sql = sql.replaceAll("insert into", "insert ignore into");  
        return replaceTableName(sql, oldContent, replaceContent);  
    }  
}  

5 最后,怎么使用呢?不用关注微信号,马上告诉你答案。

使用起来相当的简单,只要在service或者dao层执行库操作前调用 BaseInterceptor.replace(BaseInterceptor.REPLACE_TABLE_NAME,“black_list_phone”, “black_list_phone_” + groupId);即可。其中black_list_phone是模板表,groupId是我的逻辑分组,如果是1,就从black_list_phone直接映射到black_list_phone_1。

private void replaceTable(Integer groupId) {  
        BaseInterceptor.replace(BaseInterceptor.REPLACE_TABLE_NAME,  
                "black_list_phone", "black_list_phone_" + groupId);  
    }  
  
public void save(BlackListPhone entity, Integer groupId) {  
    replaceTable(groupId);  
    super.save(entity);  
}  
Python爬虫实战:高效爬取华尔街日报文章的技术与代码详解 在当今信息爆炸的时代,金融数据和分析对于投资者、研究人员和企业决策者来说至关重要。华尔街日报(WSJ)作为全球最具影响力的财经媒体之一,其文章内容具有极高的价值。本文将详细介绍如何使用Python最新技术构建一个高效、稳定的华尔街日报文章爬虫,涵盖从基础到高级的各种技术要点。本文详细介绍了如何使用Python最新技术构建一个高效、稳定的华尔街日报文章爬虫。我们从基础爬虫实现开始,逐步添加了高级功能如分布式处理、反反爬虫策略、数据清洗和存储等。异步处理:使用asyncio和httpx实现高性能网络请求。 阅读详情

相关推荐

推荐算法之Thompson(汤普森)采样

如果想理解汤普森采样算法,就必须先熟悉了解贝塔分布。 一、Beta(贝塔)分布 Beta分布是一个定义在[0,1]区间上的连续概率分布族,它有两个正值参数,称为形状参数,一般用α和β表示,Beta分布的概率密度函数形式如下: 这里的Γ表示gamma函数。 Beta分布的均值是: 方差: ...

weixin_30508241的博客 4259

spring2.5升级至spring4.1.6

spring4.1中的配置文件

wxp20032003的专栏 621

S32K3 MCAL配置 【MCU、PORT、DIO】

1、s32k3时钟源可由PLL, FXOSC, FIRC, SIRC, and SXOSC五种时钟源生成,可按照手册推荐配置。目标是在在S32K344板子上点亮红色LED灯,需要配置的有MCU、PORT、DIO模块。MCU最主要的是时钟配置,要翻看芯片手册,理解时钟树。1、通用配置中,没有什么特殊需求按照demo配置就好。1、配置MC_CGM mux 0 clocks时钟。1、外部晶振配置按照实际项目原理图进行配置。1、外部晶振配置,按照实际项目配置。1、PLL时钟按照手册进行配置。

weixin_43741076的博客 3246

Spring Framework版本升级

项目中spring framework版本升级

pany_2017的博客 1万+

STM32在六轴机械臂实时控制中的选型与分层架构设计

嵌入式实时控制系统中,微控制器的选型直接决定运动控制精度与系统可靠性。其核心在于匹配确定性中断响应、低延迟外设协同与工业协议栈支持等硬性指标。STM32凭借Cortex-M内核的NVIC调度能力、成熟HAL库及CAN FD/高级定时器等专用外设,在机电一体化场景中成为伺服控制中枢的首选。相比ESP32等通用MCU,STM32在硬实时性、EMC认证生态和工业总线兼容性上具备不可替代优势。本文围绕GTB六轴机械臂项目,详解基于STM32F407的硬件抽象层配置、FreeRTOS任务调度、事件队列解耦及闭环控制数

jupi8的博客 755

发那科FOCAS 1/2文档——核心库文件

在开始开发前,明确目标 CNC 的具体型号、连接方式(HSSB/TCP/IP)、软件版本和配置(如轴数、程序号位数),并据此正确配置开发环境和编译选项。开发时需要包含相应的头文件。这是开发跨平台应用时需要特别注意的地方。这是开发应用时必须了解的核心文件。

snailiot的博客 1021

【无标题】Spring3.x升级Spring4.x注意事项

1.出现一下问题原因是:quartz.jar 不兼容的问题 更换以下jar包便可以解决。 第二个:数据库连接失败原因是配置文件写错误等.第三个:Eclipse配置tomcat容易出错问题:

Saberman 399

银河麒麟鲲鹏aarch64架构安装docker和K8s

鲲鹏云服务器上安装docker-云社区-华为云 (huaweicloud.com) 这里我下载的版本是docker-18.09.3.tag docker 安装包地址:https://download.docker.com/linux/static/stable 配置system服务 在github对应分支的contrib/init/systemd/ 下面,提供了对应的docker.service以及docker.socket文件,可以直接拷贝到本地文件使用: 对应链接:https://github.c

qq_50007696的博客 9056

Spring3 升级Spring 4

周末加班,想把spring3升级到spring4。 列一下遇到的坑 更换spring版本为 4.2.3 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.2.3.RELEASE</version> </dependency> 加入sprin

m0_67401153的博客 1173

踩坑实录:C#上位机YOLOv11从2FPS到45FPS,ONNX Runtime GPU加速全解析

算力迁移:将推理核心从CPU迁移至GPU(核心提速手段);内存复用:避免重复分配/释放内存,减少GC压力;维度固定:工业场景固定输入分辨率,关闭动态维度;资源限制:合理限制GPU/CPU/内存占用,避免资源耗尽;解耦设计:推理线程与UI线程解耦,避免跨线程问题。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 573

高通SDX35平台 modem启动异常分析

SDX35 MIFI项目在生产时出现modem反复重启问题。经排查发现是modem在初始化GNSS模块时访问了不存在的硬件地址导致崩溃,原因是产线使用的SDX35 000-AB型号芯片阉割了GNSS功能,而本地测试使用的AA型号支持该功能。解决方案是通过修改modem编译选项,采用高通新提供的genlmm2选项(保留IMS和SMS功能但去除GNSS支持),最终解决了启动异常问题并满足VZW认证需求。

四儿家的小祖宗的博客 275

升级Spring3.1RC2 和Hibernate4.0.0CR7遇到的一些问题及解决

升级Spring3.1RC2 和Hibernate4.0.0CR7遇到的一些问题及解决 Spring3.1RC2支持 1. Quartz2 2. Hibernate4, 3. New HandlerMethod-based Support Classes For Annotated Controller Processing 4. Consumes and Produce

liusai19的专栏 574

用长tree方式做等长线

1)写一个sdc,把等长线的起点设置成clock source,用于创建create_clock,至于period和waveform等参数随便写即可。然后clock_opt -from build_clock -to route_clock即可。3)在正式cts之前或之后,给自己创建的scenario长tree并don't touch。前面讲过了如何用set_data_check做等长线,这里再讲一下如何用cts的方式做。2)为该clock创建一个新mode,并创建对应的scenario。

m0_61544122的博客 622

在 Spring 4.3.9下升级 Velocity 1.7.x to Velocity 2.0.x 出现的问题

1: Spring 的 spring-context-support 报错 java.lang.NoClassDefFoundError: org/apache/velocity/runtime/log/CommonsLogLogChute 等待 Spring 升级支持 Velocity 2.0.x 或自己改 Spring 的源码 velocity整个初始化日志过程: ...

1936

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

hibernate4 与 spring3有点冲突

整合NoSuchMethodError错误 and 升级Spring3.1RC2 和Hibernate4.0.0CR7遇到的一些问题及解决   2012-02-20 10:33:28|  分类: 编程_SSH |字号 订阅 我使用的是hibernate4和spring3,然后报的错误是 java.lang.NoSuchMethodError: org.hiberna

gyflyx的专栏 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Struts2.3.7+Spring3.0.0+Hibernate4.0.0 整合(四)Spring 升级到 3.1.0

在之前的文章《Struts2.3.7+Spring3.0.0+Hibernate4.0.0 整合》(一)、(二)、(三)中,由于Spring3.0与Hibernate4.0存在兼容性问题(主要是Spring3.0在配置时遇到 问题),最后决定升级Spring至3.1。在《Struts2.3.7 + Spring3.0.0 + Hibernate4.0.0 整合》 的基础上进行如下操作: 1、

图钉的笔记 1690

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

升级spring和hibernate到4遇到的问题总结

背景:spring从3.0.5升级到4.1.5;  hibernate从3.3.2升级到4.3.7. 错误1:Caused by: java.lang.IncompatibleClassChangeError: class org.springframework.core.type.classreading.ClassMetadataReadingVisitor has interface or

燃烧JAVA 6056

Spring3.1RC2 和Hibernate4.0.0CR7升级的一些问题及解决

http://ajava.org/blog-268-191.html

xiaokun 137

spring4+shiro1.2.3,tomcat版本使用7.0.72及以上

最近项目中用spring4+shiro1.2.3进行权限管理,频繁出现异常登出的问题,最后将tomcat从7.0.55升级到7.0.72后该问题解决。

flyer0428的博客 791

Spring Framework 4.0 Milestone 1(M1)和 3.2.3 版本于2013年5月左右发布

- **Spring 4.0 M1** 是 Spring 4.0 系列的首个里程碑版本,标志着向 Java 8、Groovy 2、Hibernate 4.2、WebSocket 支持、核心注解增强(如 `@Conditional`)、以及更完善的 REST/HTTP 消息转换等新特性的演进开端。它**不适用于生产环境**,仅用于早期尝鲜与反馈。 - **Spring 3.2.3** 是 3.2.x 系列的一个维护性补丁版本,主要包含 bug 修复、安全加固(如 CVE 修复)及少量稳定性改进,**推荐用于

[Blog][Domain] programb.blog.youkuaiyun.com 350

springboot2.7.18 升级到3.1.5过程

Spring Boot3 从 2.7.10升级到3.1.5有以下几个点需要注意。JDK 17-19。

zhaofuqiangmycomm的博客 1708

knife4j+springboot3.4异常无法正确展示文档

通过分析异常日志发现是ControllerAdviceBean类报错,在springboot3.3.5时spring-web版本是6.1.14,springboot3.4版本是6.2.0版本。结论:期待knife4j-openapi3-jakarta-spring-boot-starter早日升级,兼容最新版本的spring;通过http://ip:port/doc.html访问接口文档发现访问/v3/api-docs接口时报。此类中的构造函数已经变更为4个,已经不存在一个参数的构造函数了。

OceanSky的专栏 4242
上一篇: spring把quartz从1.8.3升级到2.2.3
下一篇: spring实现对quartz的动态增删改及启动、停止操作
lfwer
博客等级 码龄18年 8粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值