我有一个基于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
myschema
,select
中的一个或多个,从insert
(常规表和n:m中间表)和序列授予所有必要表的对象权限, update
,delete
)至myschema_app
myschema_app
中声明私有同义词,以便使用与以前相同的名称并隐藏其他模式的名称前缀hibernate.default_schema
更改为persistence.xml
context.xml
当我将hibernate.hbm2ddl.auto
设置为validate
时启动应用程序时,当框架尝试创建EntityManagerFactory
告诉我缺少表时,我会收到异常。当我在连接了myschema_app
的sql工具中直接执行select语句时,一切正常。
我知道在另一个表上使用同义词对于应用程序是透明的。有谁知道我可能忽略了什么?
答案 0 :(得分:8)
我的猜测是hbm2ddl专门用于表,而不是同义词,但是你的应用程序确实应该像模式中存在的表一样工作。尝试删除hbm2ddl选项并测试您的应用程序。
编辑:似乎我的猜测是真的:https://forum.hibernate.org/viewtopic.php?p=2438033答案 1 :(得分:4)
从4.3.0开始,可以设置hibernate.synonyms=true
来解决您的同义词问题。
参考文献:
https://github.com/hibernate/hibernate-orm/commit/1df4b2ea3c98c74f3b6bbd42e266ee5c7ad60d27
答案 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