JPA实体上的同义词而不是表

时间:2012-01-11 09:53:26

标签: hibernate jpa oracle10g seam java-ee-5

我有一个基于Seam 2.2的Java EE 5 Web应用程序,其中一堆表通过Hibernate 3.3.3映射到JPA 1.0实体。在开发期间,它运行在Tomcat 6,Oracle 10 XE和Windows 7上。

现在,操作部门已经请求将数据模型拆分为一个模式,即一个模式,即所有数据库对象(myschema)的所有者,一个模式充当应用程序的数据库用户(myschema_app) 。所以我做了以下事情:

  • 创建架构myschema_app
  • 根据使用情况(myschemaselect中的一个或多个,从insert(常规表和n:m中间表)和序列授予所有必要表的对象权限, updatedelete)至myschema_app
  • myschema_app中声明私有同义词,以便使用与以前相同的名称并隐藏其他模式的名称前缀
  • 将属性hibernate.default_schema更改为persistence.xml
  • 中的新架构名称
  • context.xml
  • 中更改Tomcat数据源定义中的用户/密码

当我将hibernate.hbm2ddl.auto设置为validate时启动应用程序时,当框架尝试创建EntityManagerFactory告诉我缺少表时,我会收到异常。当我在连接了myschema_app的sql工具中直接执行select语句时,一切正常。

我知道在另一个表上使用同义词对于应用程序是透明的。有谁知道我可能忽略了什么?

3 个答案:

答案 0 :(得分:8)

我的猜测是hbm2ddl专门用于表,而不是同义词,但是你的应用程序确实应该像模式中存在的表一样工作。尝试删除hbm2ddl选项并测试您的应用程序。

编辑:似乎我的猜测是真的:https://forum.hibernate.org/viewtopic.php?p=2438033

答案 1 :(得分:4)

答案 2 :(得分:0)

我仍然遇到验证问题,因为即使设置hibernate.synonyms=true后,我的Oracle驱动程序也没有提供正确的列,所以我没有完全禁用模式验证,而是过滤了同义词表:

在属性中:

hbm2ddl.schema_filter_provider=my.path.to.MyCustomSchemaFilterProvider

定义架构过滤器提供程序:

package my.path.to;
..
public class MyCustomSchemaFilterProvider implements SchemaFilterProvider {
    @Override
    public SchemaFilter getCreateFilter() {
        return MySchemaFilter.INSTANCE;
    }

    @Override
    public SchemaFilter getDropFilter() {
        return MySchemaFilter.INSTANCE;
    }

    @Override
    public SchemaFilter getMigrateFilter() {
        return MySchemaFilter.INSTANCE;
    }

    @Override
    public SchemaFilter getValidateFilter() {
        return MySchemaFilter.INSTANCE;
    }
}

SchemaFilter:

..
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) {
        if (table.getName().toLowerCase().equals("synonymtabletoexclude")){
            return false;
        }
        return true;
    }

    @Override
    public boolean includeSequence(Sequence sequence) {
        return true;
    }
}

这基于https://medium.com/@horiaconstantin/excluding-hibernate-entities-from-auto-generation-bce86f8e6d94