添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
没有腹肌的开水瓶  ·  Exception in thread ...·  2 周前    · 
英勇无比的莴苣  ·  Better error message ...·  5 天前    · 
爱热闹的葫芦  ·  Column.IsIdentity ...·  4 天前    · 
兴奋的玉米  ·  Mapping Attributes✨ | ...·  4 天前    · 
打篮球的铁链  ·  OAuth2.0 - ...·  5 月前    · 
非常酷的黄豆  ·  政策详情页·  7 月前    · 

前言
jpa是通过对实体上注解表名的方式来绑定对象和数据库表的关系,并进行读写的。但有时我们会需要动态的读写表,比如同一张表带日期后缀名table_yyyyMM。本文介绍如何使用拦截器来达到这一目的。

jpa拦截器

在生成jdbc语句之前,hibernate会将sql经过拦截器处理。我们可以通过实现 StatementInspector 接口来自定义在拦截到sql时如何进行处理。
在这里插入图片描述
接下来实现接口,并做相应的表明替换:

public class MyInspector implements StatementInspector {
    @Override
    public String inspect(String sql) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
        String formattedDate = dateFormat.format(new Date());
        return sql.replace("yyyyMM", formattedDate);

这是实体类中Table注解的占位:

@Entity
@Table(name = "test_tb_yyyyMM")
@Cacheable(value = false)
public class TestTb {
	// 省略实体属性

通过修改yml配置来注册我们自定义的拦截器。注意,虽然session_factorystatement_inspector在idea中没法直接打出来,但还是能正常工作的。其中show-sql命令会将执行的sql打印出来,方便观察效果。

spring:
  jpa:
    database: MySQL
    show-sql: true
    properties:
      hibernate:
        session_factory:
          statement_inspector: com.example.jpademo.MyInspector

这样就通过修改sql拦截器的方式,实现了对sql中表明的动态调整。比如当前时间是202312,那么就能识别到table_202312,下个月能自动识别table_202401。

public class AutoTableNameInterceptor extends EmptyInterceptor { public static ThreadLocal<Map<String, String>> myTable = new ThreadLocal<>(); @Override public String onPrepareStat
SpringDataJPA笔记(10)-动态设置表名 在实际使用中可能会遇到需要动态设置表名的情况,特别是通常在后台管理系统里面,总有一些相似的功能需要抽象出来写一些公共的方法,以减少代码开发量,降低重复劳动 首先看BaseRepository的代码 @NoRepositoryBean public interface BaseRepository<T, ID extends Seriali...
拦截器在在流行的开源框架中很常见,依赖的技术就是Java的动态代理。 理解拦截器的核心原理对理解这些开源框架的体系结构至关重要。 下面以一个简单的模型的来说明拦截器的实现的一般方法。 模型分为以下模块: 业务组件:是被代理和被拦截的对象。代理处理器:实现了InvocationHandler接口的一个对象代理对象:Proxy对象。拦截器:普通的Java...
我们项目重构加上了很多数据权限的东西,项目中使用了mybatis 和 jpa。经手的人多了就是这样。 mybatis 我们使用的是拦截器sql动态拼接,现在jpa也需要这样做。 以下是jpa 拦截器的配置。 第一步: 实现 hibernate接口。重写方法 public class JpaInterceptor implements StatementInspector { @Ov...
环境中MySQL数据库需要改成大小写敏感形式,而系统中存在着以前留下来的老sql,格式不规范,数目庞大,使用多种jdbc框架,如hibernate,jdbctemplate等;需要老sql表名全部改为大写 2、mysql 大小写策略说明 my.cnf里将lower_case_table_names=1 表示对表名大写不敏感; MySQL在Linux下数据库名、表名... #{#entityName} 默认为 实体类@Entity注解的value值,会修改了其中实现 @Query(nativeQuery=true,value="delete from #{#entityName} where mobile=:#{#mobile}") int deleteByMobile(@Param("entityName")String entityName,@Param("mobile")String mobile); 主要修改类:(
jpa实体对象如何动态获取表名? 现在数据库中有6张表,表结构相同,表名后缀不同,如:T00,T01,T02..T05, 后缀是使用表中的字段xx通过hash计算出来的 这种实体,如何动态获取到表名。要是表多了有的是按月分表的,如何定义这些表对应的实体类,最好是只使用一个类来处理。 各位有谁遇到过这种情况?? hibernate 文档描述 5. 然后通过springboot 配置 spring.jpa.properties.hibernate.session_factory.statement_inspector=自己的拦截器,然后在拦截器内解析sql,并完成数据权限实现。
Spring Data JPA 自定义实现动态表名映射(支持@Table("#{javaConfig.property}"配置)实现思路介绍1. 自定义hibernate命名策略2. 配置自定义策略3. JavaConfig定义4. 使用方式说明使用版本说明自定义hibernate命名策略配置自定义策略JavaConfig定义使用方式 实现思路介绍 本文意在实现jpa中 @Table(name=“...
第一步: 实现 hibernate接口。重写方法 public class JpaInterceptor implements StatementInspector { @Override public String inspect(String sql) { System.out.println("进入拦截器" + sql); sql+= " a...