Подтвердить что ты не робот

Как настроить hibernate для сканирования объектов в другом модуле

У меня есть модуль A и модуль B, у которых есть аннотированные классы JPA. Модуль B имеет unit test, который тянет пару из этих объектов от A. Оба модуля скомпилированы, зависимости от времени выполнения установлены в порядке, но я получаю следующую ошибку, когда пытаюсь запустить unit test:

java.lang.IllegalArgumentException: Unknown entity: MyClassHere
Caused by: org.hibernate.MappingException: Unknown entity: MyClassHere

Это происходит в вызове EntityManager.merge.

Поскольку модуль B имеет все конфигурационные файлы hibernate и т.д., я предполагаю, что это просто не означает, что мой класс из A является сущностью.

Я попытался добавить следующее в persistence.xml

<exclude-unlisted-classes>false</exclude-unlisted-classes>

В hibernate.cfg.xml я добавил:

<property name="packagesToScan">myNamespace.*</property>

Тогда:

 <property name="packagesToScan">
                <array>
                    <value>myNamespace.*</value>
                </array>
</property>

Это дало мне ошибку, что содержимое "property" должно соответствовать нулевому значению. Затем я попробовал:

<mapping class="myNamespace.*" />

Что мне не хватает?

Изменить:. Одна вещь, о которой я забыл упомянуть, может иметь значение, так это то, что два модуля настроены как отдельные проекты (я использую eclipse), поэтому структура каталогов отличается. Зависимости времени выполнения настроены правильно, но поскольку файлы .class попадают в разные каталоги, я думаю, что спящий режим может не сканировать их.

4b9b3361

Ответ 1

  • Если вы используете hibernate/spring, мы можем расширить Объект LocalSessionFactoryBean и сканирование через проект определить классы объектов в проекте.
  • Поскольку вы говорите два разных проекта, попробуйте написать некоторая утилита времени сборки для анализа двух проектов и создания одного сущность xml файла, который решает вашу проблему.

Ответ 2

Если вы настроите свой проект на автоматическое определение сущностей, он будет проверять только путь, по которому META-INF/persistence.xml(по умолчанию).

В дополнение к:

<exclude-unlisted-classes>false</exclude-unlisted-classes>

Вы устанавливаете дополнительный вариант спящего режима:

<property name="hibernate.archive.autodetection" value="class, hbm" />

Определяет, какой элемент автоматически открывается Hibernate Entity Manager.

Для дополнительных объектов (в других банках) вы можете установить jar файл в основном файле persistence.xml:

<persistence>
    <persistence-unit name="myUnit">
        ...
        <class>foo.bar.Entity1</class>
        <class>foo.bar.Entity2</class>
        <jar-file>moduleB.jar</jar-file>
        ...
    </persistence-unit>
</persistence>

Элемент jar-file указывает JAR файлы, которые отображаются в упакованном модуле персистентности, которые содержат управляемые классы персистентности, тогда как элемент класса явно называет управляемые классы персистентности.

Файл или каталог JAR, каталог META-INF которых содержит файл persistence.xml, называется корнем блока сохранения. Объем единицы персистентности определяется корнем констант. Каждая единица персистентности должна быть идентифицирована с именем, которое уникально для области единиц продолжительности.

С уважением, Андре

Ответ 3

persistence.xml может содержать элемент <jar-file>....jar</jar-file>: указывает один или несколько файлов JAR, которые будут искать классы.

Ответ 4

Мы решили аналогичную проблему в проекте, над которым я работаю, используя Spring для обнаружения объектов. Например. используя аннотированную конфигурацию Spring:

@Configuration
@ComponentScan("com.org.prj.myNamespace1", "com.org.prj.myNamespace2")
public class MyDatabaseConfig {
    @Bean
    public EntityManagerFactory entityManagerFactory() {
        final LocalContainerEntityManagerFactoryBean factory =
            new LocalContainerEntityManagerFactoryBean();

        // ...JPA properties, vendor adaptor, dialect, data source, persistence unit etc...

        factory.setPackagesToScan("com.org.prj.myNamespace1", "com.org.prj.myNamespace2");

        factory.afterPropertiesSet();
        return factory.getObject();
    }

    // ...Data source beans etc...
}

Ответ 5

Недавно я решил аналогичную проблему, добавив путь jar к файлу persistence.xml

<jar-file>file:///C:/yourpath/yourJar.jar</jar-file>

Надеюсь, это поможет.  

Ответ 6

  • src/main/resources: applicationContext.xml
  • src/test/resources: test-applicationContext.xml

Убедитесь, что в области проверки вы также создаете контекст приложения для сканирования этих объектов. Ваш test-applicationContext.xml может не настроить весь контекст приложения как во время выполнения, но также необходимо включить некоторые вещи, которые также необходимы во время тестирования, например, сканирование пакетов.

Вы можете, конечно, создать persistence.xml в src/main/resources и включить его как в applicationContext.xml, так и в test-applicationContext.xml