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

时间:2011-06-02 08:27:22

标签: hibernate validation

如何在Hibernate中为某些实体(并非所有实体)禁用架构验证?我的一些实体正在使用SQL导致验证失败,因此我想禁用它们的验证。

2 个答案:

答案 0 :(得分:2)

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

可以通过提供自定义org.hibernate.tool.schema.spi.SchemaFilterProvider来过滤验证,该自定义org.hibernate.tool.schema.spi.SchemaFilter将由验证操作使用。要使用自定义提供程序(如@tomerz所述),必须为属性hibernate.hbm2ddl.schema_filter_provider设置类的名称。例如,如果在persistence.xml add

中将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过滤。

答案 1 :(得分:1)

不确定您使用的是哪种版本的hibernate,但可以使用以下命令来完成:hibernate.hbm2ddl.schema_filter_provider property

Hibernate Configuration

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