JPA配置不生成外键
程序员文章站
2022-04-20 21:12:37
...
JPA配置不生成外键
通过查看源码发现创建外键的SQL语句是通过Dialect的StandardForeignKeyExporter对象来生成的,而JPA(hibernate)允许我们自定义Dialect的解析器(DialectResolver)。因此我们可以先配置自定义的DialectResolver,解析Dialect的方法直接抄StandardDialectResolver里面的代码,在获取到正确的Dialect后,我们再通过cglib动态生成代理类,拦截其中的getForeignKeyExporter方法,给他返回一个自定义的StandardForeignKeyExporter类,将getSqlCreateStrings方法的返回值直接改为Exporter.NO_COMMANDS,这样就获取不到创建外键的SQL语句。
- MyInterceptor.java (作用:cglib方法拦截器,拦截类的方法)
public class MyInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object object, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
//直接返回Exporter.NO_COMMANDS
if(method.getName().equals("getForeignKeyExporter")){
return new StandardForeignKeyExporter((Dialect) object){
@Override
public String[] getSqlCreateStrings(ForeignKey foreignKey, Metadata metadata) {
return Exporter.NO_COMMANDS;
}
@Override
public String[] getSqlDropStrings(ForeignKey foreignKey, Metadata metadata) {
return Exporter.NO_COMMANDS;
}
};
}
return methodProxy.invokeSuper(object, objects);
}
}
- MyStandardDialectResolver.java (自定义DialectResolver)
import org.hibernate.dialect.Database;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
import org.hibernate.engine.jdbc.dialect.spi.DialectResolver;
import org.springframework.cglib.proxy.Enhancer;
/**
* 自定义方言解析器
*
* @Author: yx
* @Date: 2021/12/10
**/
public class MyStandardDialectResolver implements DialectResolver {
@Override
public Dialect resolveDialect(DialectResolutionInfo info) {
for ( Database database : Database.values() ) {
Dialect dialect = database.resolveDialect( info );
if ( dialect != null ) {
MyInterceptor myInterceptor = new MyInterceptor();
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(dialect.getClass()); // 设置超类,cglib是通过继承来实现的
enhancer.setCallback(myInterceptor);
return (Dialect) enhancer.create();
}
}
return null;
}
}
- 在application.yml(或者properties)配置自定义DialectResolver
spring:
jpa:
show-sql: true
open-in-view: true
hibernate:
ddl-auto: update
properties:
hibernate:
enable_lazy_load_no_trans: true
# 配置自定义DialectResolver
dialect_resolvers: com.acrabsoft.web.develop.base.util.MyStandardDialectResolver
format_sql: true
上一篇: sql中将字符串转换为decimal
下一篇: JavaEE心得体会