У меня есть веб-приложение Java EE 5 на базе Seam 2.2 с набором таблиц, сопоставленных с объектами JPA 1.0 через Hibernate 3.3.3. . Во время разработки он работает на Tomcat 6, Oracle 10 XE и Windows 7.
Теперь у нас был запрос от отдела операций на разделение модели данных на одну схему, являющуюся владельцем всех объектов базы данных ( myschema
]) и одна схема, действующая как пользователь базы данных приложения ( myschema_app
).Итак, я сделал следующее:
myschema_app
myschema
(как обычные, так и промежуточные таблицы n: m) и последовательности в зависимости от использования (один или несколько из select
, insert
, update
, delete
) до myschema_app
myschema_app
, чтобы использовать те же имена, что и раньше, и скрыть префикс имени другой схемы hibernate.default_schema
на новое имя схемы в persistence.xml
context.xml
Когда я запускаю приложение, когда для hibernate.hbm2ddl.auto
установлено значение validate
, я получаю исключение когда структура пытается создать EntityManagerFactory
, сообщая мне, что таблица отсутствует. Когда я выполняю оператор выбора непосредственно в инструменте sql с подключенным myschema_app
, все работает нормально.
Я понял, что использование синонима в другой таблице прозрачно для приложения. Кто-нибудь знает, что я, возможно, упустил из виду?
У меня все еще были проблемы проверки, потому что мой драйвер Oracle не давал правые столбцы даже после установки hibernate.synonyms=true
, таким образом, вместо того, чтобы отключить проверку схемы полностью я фильтровал таблицу синонима:
свойства In:
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