SpringBoot-JPA⽀持分表
简介
- JPA Entity对象继承,通过@Inheritance配置,有三种⽅式SINGLE_TABLE、TABLE_PER_CLASS、JOINED,这⾥不作赘述。
- Entity对象的分库分表操作
- 分库,为了管理DB的连接数,建议通过⼊⼝的分流,将不同DB的数据分流到不同的应⽤;
- 分表,这是本⽂关注的主要问题,⽬标是调⽤JPA时不需要关⼼是否分表以及映射的规则,即分表对于Entity操作层是透明的;主要的步骤如下:          - 对象声明
- 实现JPA interceptor
- 加载
对象声明
- 数据对象的基类,引⼊了@MappedSuperclass,如下⾯的样例
@MappedSuperclass
class UserBase {
@Id
private Long id;
private String name;
private int age;
... ...
}
- 数据对象,继承基类,使⽤[@Entity](my.oschina/u/1260961),如下⾯的样例
//模板表,⽤于JPA代码编写
@Entity
@Table(name = "t_user")
public class User extends UserBase { ... ...}
//id是0或者偶数的数据分表,⽤于配置了hibernate.ddl-auto时维护库表结构,不会出现在JPA相关代码中
@Entity
@Table(name = "t_user_0")
public class User0 extends UserBase { ... ...}
//与User0对应,id是奇数的数据分表
@Entity
@Table(name = "t_user_1")
public class User1 extends UserBase { ... ...}
// 数据对象操作类声明
public interface UserDao extends CrudRepository<User, Long> {}
JPA interceptor
- 声明
import org.hibernate.EmptyInterceptor;
public class MyInterceptor extends EmptyInterceptor {
- 推荐使⽤ThreadLocal缓存业务对象类型和ID
static class Cached {
Class<?> clazz;
Serializable id;
Cached(Class<?> clazz, Serializable id) {
super();
this.clazz = clazz;
this.id = id;
}
... ... //⾃动⽣成的hashCode、equals⽅法
- 重载如下的⽅法onLoad、onSave、getEntity,调⽤ThreadLocal.set - 重载onPrepareStatement⽅法,⽰意代码如下
Cached id = ();
if(id == null) {
return sql;
}
if(id.clazz == User.class) {
long offset = ((Long)id.id).longValue() / 2;
place("t_user", "t_user_" + offset);
}
加载 l
springboot结构
spring:
jpa:
properties:
hibernate:
ejb:
interceptor: [类名]

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。