EclipseLink, EntityManager с двумя постоянными модулями, необходимыми - PullRequest
3 голосов
/ 16 ноября 2009

У меня есть одна библиотека jar A (или проект в eclipse), у которой есть своя единица постоянства (META-INF / persistence.xml) и некоторые классы сущностей, и другой проект (B), использующий эту. В проекте B есть также единица персистентности и классы сущностей.

В проекте BI необходимо использовать оба класса сущностей из проектов A и B. Но если я установлю «A» в качестве имени единицы персистентности, EntityManager не сможет создать именованный запрос, если этот запрос находится в сущности из проекта B. Если я установлю «B "как имя единицы сохраняемости, он не может создавать именованные запросы из сущностей из проекта А. Сообщение об ошибке:

NamedQuery of name: MyEntityName.myQueryName not found.

Могут ли единицы постоянства каким-либо образом включать другие единицы персистентности? Или есть другой способ решить эту проблему?

Ответы [ 2 ]

4 голосов
/ 16 августа 2012

EclipseLink 2.3 представил Составные единицы персистентности , которые позволяют создавать единицы персистентности, которые по существу действуют только как контейнер для двух или более реальных единиц персистентности. После этого вы сможете использовать этот единственный составной блок персистентности в вашем приложении, как если бы у вас был только один блок персистентности. Это должно соответствовать вашим целям поддержания чистоты ваших файлов persistence.xml для простой синхронизации вашей модели с базой данных. Довольно классные вещи.

2 голосов
/ 16 ноября 2009

Вы можете перечислить ваши классы , необходимые для A, в одной единице персистентности, а классы, необходимые вам B, в другой:

<persistence ...>
    <persistence-unit name="projectA" ...>
        ....
        <class>a.Class1</class>
        <class>a.Class2</class>
        <class>a.Class3</class>
    </persistence-unit>

    <persistence-unit name="projectB" ...>
        ...
        <class>a.Class1</class>
        <class>a.Class2</class>
        <class>a.Class3</class>
        <class>b.Class1</class>
        <class>b.Class2</class>
        <class>b.Class3</class>
    </persistence-unit>
</persistence>

В качестве альтернативы, вы можете использовать элемент , цитируя из спецификации JPA (6.2.1.6): " Если указано, в этих файлах JAR будет выполняться поиск классов управляемых персистентностей и любые аннотации метаданных сопоставления, найденные на них, будут обработаны, или они будут отображены с использованием значений аннотации сопоставления, определенных этой спецификацией. Такие JAR-файлы указываются относительно корня модуля постоянства (например, utils / myUtils.jar) ."

<persistence ...>
    <persistence-unit name="projectA" ...>
        ...
        <jar-file>relative/path/to/your/library.jar</jar-file>
    </persistence-unit>
</persistence>
...