如何在 Hibernate 中为某些实体禁用模式验证?
Posted
技术标签:
【中文标题】如何在 Hibernate 中为某些实体禁用模式验证?【英文标题】:How to disable schema validation in Hibernate for certain entities? 【发布时间】:2011-06-02 08:27:21 【问题描述】:如何在Hibernate 中为某些实体(不是全部)禁用架构验证?我的一些实体正在使用导致验证失败的 SQL,因此我想为它们禁用验证。
【问题讨论】:
【参考方案1】:这是一个很老的问题,但我认为这可能会有所帮助。
可以通过提供自定义org.hibernate.tool.schema.spi.SchemaFilterProvider
来过滤验证,该org.hibernate.tool.schema.spi.SchemaFilterProvider
指定验证操作要使用的org.hibernate.tool.schema.spi.SchemaFilter
。要使用自定义提供程序(如 @tomerz 所述),必须使用类的名称设置属性 hibernate.hbm2ddl.schema_filter_provider
。例如,如果在 persistence.xml
添加中使用 Hibernate 作为 JPA 提供程序
<property name="hibernate.hbm2ddl.schema_filter_provider" value="com.my.package.MySchemaFilterProvider"/>.
也可以通过编程方式设置(参见Hibernate Programmatic Configuration)
提供者:
package com.my.package;
import org.hibernate.tool.schema.internal.DefaultSchemaFilter;
import org.hibernate.tool.schema.spi.SchemaFilter;
import org.hibernate.tool.schema.spi.SchemaFilterProvider;
public class MySchemaFilterProvider implements SchemaFilterProvider
@Override
public SchemaFilter getCreateFilter()
return DefaultSchemaFilter.INSTANCE;
@Override
public SchemaFilter getDropFilter()
return DefaultSchemaFilter.INSTANCE;
@Override
public SchemaFilter getMigrateFilter()
return DefaultSchemaFilter.INSTANCE;
@Override
public SchemaFilter getValidateFilter()
return MySchemaFilter.INSTANCE;
自定义过滤器:
public class MySchemaFilter implements SchemaFilter
public static final MySchemaFilter INSTANCE = new MySchemaFilter();
@Override
public boolean includeNamespace(Namespace namespace)
return true;
@Override
public boolean includeTable(Table table)
return !table.getName().contains("the name of the entity to exclude");
@Override
public boolean includeSequence(Sequence sequence)
return true;
通过这样做,DefaultSchemaFilter
用于数据库架构上的所有操作,但实体验证除外。验证操作将被MySchemaFilter
过滤。
【讨论】:
【参考方案2】:我不确定您使用的是哪个版本的 Hibernate,但可以使用 hibernate.hbm2ddl.schema_filter_provider
属性来完成。
来自Hibernate Configuration:
用于指定 org.hibernate.tool.schema.spi.SchemaFilterProvider 供数据库架构上的创建、删除、迁移和验证操作使用。 SchemaFilterProvider 提供了过滤器,可用于将这些操作的范围限制为特定的命名空间、表和序列。所有对象都被defau所包含
【讨论】:
【参考方案3】:从 b0gusb 和 Spring Boot 的答案开始……
在 application.yml 添加:
spring.jpa.properties.hibernate.hbm2ddl.schema_filter_provider=com.my.package.MySchemaFilterProvider
【讨论】:
以上是关于如何在 Hibernate 中为某些实体禁用模式验证?的主要内容,如果未能解决你的问题,请参考以下文章
如何配置 Hibernate Envers 以避免实体修订查询中的某些集合(连接表)
hibernate中使用annotation映射的时候,如何指定实体类中的某些字段不映射到数据库?
在 laravel 5.4 中为某些路由禁用 csrf 令牌?不工作[重复]
Spring Data / Hibernate 使用 Postgres 保存实体,在冲突更新某些字段时使用插入
无法在模式“”中为实体“OpenIddictApplication”使用表“OpenIddictApplications”,因为它正在用于另一个实体