如何在 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 令牌?不工作[重复]

如何根据某些搜索模式在 unix 中为文本文件着色?

Spring Data / Hibernate 使用 Postgres 保存实体,在冲突更新某些字段时使用插入

无法在模式“”中为实体“OpenIddictApplication”使用表“OpenIddictApplications”,因为它正在用于另一个实体