如何在 Hibernate 中为某些实体禁用模式验证?

yur*_*ura 10 validation hibernate

如何在Hibernate 中为某些实体(不是全部)禁用模式验证?我的一些实体正在使用导致验证失败的 SQL,所以我想禁用它们的验证。

b0g*_*usb 12

一个很老的问题,但我认为这可能会有所帮助。

可以通过提供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"/>. 
Run Code Online (Sandbox Code Playgroud)

它也可以以编程方式设置(请参阅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;
  }
}
Run Code Online (Sandbox Code Playgroud)

自定义过滤器:

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

通过这样做,DefaultSchemaFilter除了实体的验证之外, 用于数据库模式上的所有操作。验证操作将被过滤MySchemaFilter


tom*_*erz 2

我不确定您使用的是哪个版本的 Hibernate,但可以使用该hibernate.hbm2ddl.schema_filter_provider属性来完成。

休眠配置

用于指定数据库模式上的创建、删除、迁移和验证操作所使用的 org.hibernate.tool.schema.spi.SchemaFilterProvider。SchemaFilterProvider 提供了过滤器,可用于将这些操作的范围限制为特定的命名空间、表和序列。默认包含所有对象