如何在Hibernate中为某些实体(并非所有实体)禁用架构验证?我的一些实体正在使用SQL导致验证失败,因此我想禁用它们的验证。
答案 0 :(得分:2)
一个古老的问题,但我认为这可能会有所帮助。
可以通过提供自定义org.hibernate.tool.schema.spi.SchemaFilterProvider
来过滤验证,该自定义org.hibernate.tool.schema.spi.SchemaFilter
将由验证操作使用。要使用自定义提供程序(如@tomerz所述),必须为属性hibernate.hbm2ddl.schema_filter_provider
设置类的名称。例如,如果在persistence.xml
add
<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
用于指定要在数据库模式上创建,删除,迁移和验证操作时使用的org.hibernate.tool.schema.spi.SchemaFilterProvider。 SchemaFilterProvider提供了可用于将这些操作的范围限制为特定名称空间,表和序列的过滤器。 defau包含所有对象