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

JPA - несколько банок, определяющих объекты @Entity

Мы разрабатываем веб-приложение с Spring, Hibernate и Maven очень модульным способом. Существуют основные проекты, определяющие доступ к данным и просмотр конкретных материалов, тогда есть модули, определяющие логику и сущности (@Entity), а затем есть веб-приложение, определяющее контроллер и представление.

Теперь у нас есть модуль безопасности, определяющий объекты безопасности, такие как учетная запись и роль, и у нас есть прототип-модуль, определяющий некоторые примерные объекты, такие как клиент и заказ. Оба имеют PersistenceUnit, определенные внутри persistence.xml, который довольно много пуст, за исключением имени PersistenceUnit, поскольку вся настройка базы данных выполняется в веб-приложении с помощью datasource.xml. Предполагается, что веб-приложение загружает обе банки в качестве зависимостей maven.

Оба проекта будут создавать тонкие, автоматически очищать все объекты и создавать их для своих модульных тестов. Они также будут загружены внутри веб-приложения успешно, если будут добавлены индивидуально.

Однако, как только оба загружаются одновременно, второй будет переопределять PersistenceUnit первого и, таким образом, создать IllegalArgumentException : Not an entity для всех объектов из первого. Если у обоих проектов есть другая единица персистентности, загрузка веб-приложения вызовет еще одно исключение, говорящее, что no single default persistence unit определено.

Итак, как я могу получить все аннотированные классы @Entity для загрузки в моем веб-приложении без необходимости их определения внутри persistence.xml (например, здесь), а скорее через проверку компонентов? Это кажется идеей, хотя я не знаю, как ее использовать и проверять...

Мне кажется, нам нужно объединить все PersistenceUnits внутри веб-приложения или загрузить все Entities программно. Определение их жестко закодированных внутри persistence.xml не является для нас вариантом.

4b9b3361

Ответ 1

Мы используем аналогичный макет модуля, но мы помещаем контекст персистентности в военную часть нашего приложения и вводим entitymanager в DAO модулей. За исключением модульных испытаний, модули не имеют PU. Мы сделали это, потому что боялись, что транзакция, охватывающая несколько модулей, может вызвать проблемы.

В DAO

@PersistenceContext
private EntityManager em;

В файле persistance.xml вам нужно заручиться всеми объектами с элементами.

<persistence-unit name="myPU">
    <class>com.Entity1</class>      
<class>com.Entity2</class>

и др.

Ответ 2

Поскольку вопрос, похоже, все еще привлекает внимание, я опубликую наше последнее решение проблемы.

Теперь мы автоматически сканируем все пакеты вместо использования файлов persistence.xml.

В нашем datasource.xml мы добавили строку

<property name="packagesToScan" value="our.basepackage" />

Почти полный файл datasource.xml:

<!-- Bean definition here -->

<bean id="ourDataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
            <!-- define connection properties -->       
</bean>


<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="ourDataSource" />
    <property name="packagesToScan" value="our.basepackage" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="false" />
            <property name="generateDdl" value="true" />
            <property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
        </bean>
    </property>

</bean>

<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" />

Ответ 4

Хорошо, у нас есть аналогичная проблема в нашем цикле разработки. Если ваши референтные объекты находятся в другом файле -ejb.jar(это наш случай), вы можете связать эти объекты с помощью

<jar-file>relativePathToYourJar/dependent-entities-ejb.jar</jar-file>

тег. Обратите внимание, что вы также должны включить persistence.xml в папку dependent-entities-ejb.jar META-INF. Более подробную информацию можно найти здесь.