JPA Entiy на синониме вместо таблицы

У меня есть веб-приложение 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
  • изменить пользователя / пароль в определении источника данных Tomcat в context.xml

Когда я запускаю приложение, когда для hibernate.hbm2ddl.auto установлено значение validate , я получаю исключение когда структура пытается создать EntityManagerFactory , сообщая мне, что таблица отсутствует. Когда я выполняю оператор выбора непосредственно в инструменте sql с подключенным myschema_app , все работает нормально.

Я понял, что использование синонима в другой таблице прозрачно для приложения. Кто-нибудь знает, что я, возможно, упустил из виду?

9
задан Arjan Tijms 18 August 2013 в 19:49
поделиться

1 ответ

У меня все еще были проблемы проверки, потому что мой драйвер 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

0
ответ дан 2 November 2019 в 23:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: