背景:
使用JPA保存数据时,需要根据单位将数据保存到不同的表中
单位 | 缩写 | 表 |
---|---|---|
北京 | BJ | USERBJ |
山东 | SD | USERSD |
jpa:
properties:
hibernate:
ejb:
# 注册自定义的插件类
interceptor: com.xxx.Interceptor
保存实际信息类
/**
*@description 线程安全的类,保存实际信息
**/
public class ReqContextHolder {
private ReqContextHolder() {
}
protected static ThreadLocal<String> bhThreadLocal = new ThreadLocal<>();
public static void setbh(String bh) {
bhThreadLocal.set(bh);
}
public static String getbh() {
return bhThreadLocal.get();
}
public static void remove() {
bhThreadLocal.remove();
}
}
动态表存入(拦截器),用来在 Hibernate 处理实体时插入额外的逻辑
public class Interceptor extends EmptyInterceptor {
@Override
public String onPrepareStatement(String sql) {
String bh = ReqContextHolder.getbh();
// 对表名进行替换
if (!StringUtil.isNullOrEmpty(bh)) {
sql = sql.toLowerCase(Locale.ROOT);
if (sql.contains("user")) {
//表名增加个性化后缀
sql = sql.replaceFirst("user", "user" + bh);
}
return sql;
}
return super.onPrepareStatement(sql);
}
调用:
@Resource
private UserRepository userRepository;
User user = new User;
user.setName("123");
user.setCode("456");
ReqContextHolder.setbh("BJ");
userRepository.save(user); //userBJ
ReqContextHolder.remove();