Объект в другом пакете создает «ссылки на неизвестный объект» (сценарий с несколькими источниками данных) - PullRequest
0 голосов
/ 27 октября 2018

В настоящее время у меня есть 2 разные конфигурации источника данных, которые работали правильно.Но поскольку сущности получают больше, я хочу поместить их в разные пакеты.

Вот структура папок и конфигурации БД.

Конфигурация LocalDatabase.(2 изображения)

enter image description here

enter image description here

Структура папок выглядит следующим образом

Folder structure is like this

Исключение, которое происходит:

org.springframework.beans.factory.BeanCreationException: Ошибка создания компонента с именем localEntityManager, определенным в классересурс пути [com / bennusoft / merlin / robot / business / database / LocalDBConfig.class]: сбой вызова метода init;Вложенное исключение - org.hibernate.AnnotationException: @OneToOne или @ManyToOne для com.bennusoft.merlin.robot.business.database.a.BilyonerBahisSoccerSpecialDatabase.iddaaGeneralDatabases ссылается на неизвестную сущность: com.bennusoft.biddaGot

Если BilyonerBahisSoccerSpecialDatabase находится в одном пакете, проблем нет, он просто запустится.Но когда он находится ниже пакета, тогда происходит это исключение.

Каким-то образом он не видит из BilyonerBahisSoccerSpecialDatabase верхний пакет на мой взгляд.Но я не знаю, где я могу на самом деле.

Как я могу заставить эту работу работать с разными пакетами?

ОБНОВЛЕНИЕ 1: Если я останусь на фабрике только с.packages (IddaaGeneralDatabase.class) проблема решена.

Так что мой вопрос фактически меняется.Почему добавление разных пакетов нарушает его?

1 Ответ

0 голосов
/ 27 октября 2018

Из исходного кода EntityManagerFactoryBuilder.java Builder.packages(Class<?>... basePackageClass) метод

    public Builder packages(Class<?>... basePackageClasses) {
        Set<String> packages = new HashSet<>();
        for (Class<?> type : basePackageClasses) {
            packages.add(ClassUtils.getPackageName(type));
        }
        this.packagesToScan = StringUtils.toStringArray(packages);
        return this;
    }

И как вы вызываете метод построителя

  return builder.dataSource(mysqlDataSource())
                .properties(hibernateProperties())
                .packages(IddaaGeneralDatabase.class)
                .packages(BilyonerBahisSoccerSpecialDatabase.class)
                .....

Как вы вызываетеМетод пакетов не является правильным.Каждый раз, когда вы вызываете метод packages, this.packagesToScan из Builder будет переопределяться.Следовательно, после вашего второго вызова this.packagesToScan теперь com.bennusoft.merlin.robot.business.database.a и, следовательно, классы в пакете com.bennusoft.merlin.robot.business.database не сканируются.Кроме того, после обновления второй вызов удаляется, this.packagesToScan сохраняется как com.bennusoft.merlin.robot.business.database, этот пакет и подпакеты сканируются, и, следовательно, проблема решена.

Если вам нужно добавить другиеклассы, один пакет которых не является подпакетом другого класса, вы можете вместо этого вызвать builder.packages(ClassA.class, ClassB.class).

Наконец, в следующий раз, пожалуйста, попробуйте скопировать и вставить код в пост вместо экранной шапки, которые помогают нам прочитать / скопировать код и понять вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...