Смешивание аннотаций JPA и конфигурации XML - PullRequest
3 голосов
/ 15 мая 2010

У меня довольно большой (новый) проект, в котором мы аннотировали множество классов доменов с помощью сопоставлений JPA. Теперь пришло время реализовать много именованных запросов - некоторые объекты могут иметь до 15-20 именованных запросов. Я думаю, что написание этих именованных запросов в аннотациях будет загромождать исходные файлы, и поэтому я рассматриваю возможность помещения их в файлы сопоставления XML.

Возможно ли это?

Морт важно, это разумно?

Есть ли лучшие подходы?

Как это сделать?

Ответы [ 3 ]

6 голосов
/ 15 мая 2010

Возможно ли это?

Да, это так, но существует тенденция к централизации, а не к обратному.

Что более важно, это разумно?

Я не раздражен наличием блока аннотаций в верхней части моих файлов классов сущностей. На самом деле, Мне нравится, когда мои запросы находятся там, где, как мне кажется, они принадлежат: рядом с сущностями. I также как проверки времени компиляции (для имен объектов, атрибутов) и завершение кода, которое я получаю при написании запросов в коде Java (не уверен, что моя IDE будет делать это с отображениями xml). Другими словами, I не чувствует необходимости и не хочет экстернализировать запросы.

Есть ли лучшие подходы?

Я считаю, что использование аннотаций - лучшая практика 1 .

Как это сделать?

Рекомендуется использовать файлы сопоставления XML только для собственных операторов SQL, которые специфичны для конкретной базы данных (конечно, я опускаю очевидный случай унаследованного кода, который вы не можете аннотировать). Другими словами, используйте аннотации, но сохраняйте код как можно более свободным от информации, специфичной для поставщика.

1 Совместное руководство спецификации JPA 1.0 Майк Кейт охватывало многие компромиссы, связанные со стратегией метаданных XML (стратегией XML), по сравнению с исходным кодом стратегия метаданных (стратегия аннотаций) в столбце OTN «аннотировать или нет». К сожалению, я не смог найти не мертвую ссылку на его публикацию. Может быть, вам повезет больше, и в этом случае, прочитайте его.

2 голосов
/ 25 сентября 2011

Я знаю, что это немного поздно, но я сталкивался с этим, и в моем проекте я использовал org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean (в контейнере Spring, конечно). Мне очень нравится JPA, и я уверен, что это облегчит жизнь, но я хочу использовать свои доменные классы в проекте, который не использует Hibernate, JPA, Spring или что-то подобное. Мы решили, что было бы лучше оставить некоторые из наших классов доменов свободными от аннотаций Java Persistence, если это возможно.

Я знаю, что это простая вещь, которая, вероятно, очевидна для многих, но это заняло у меня некоторое время. Ниже мой пример заметки POJO, что у меня нет комментариев:

package mypackage.domain;
public class Profile {
    private Long id;
    private String friendlyName;
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getFriendlyName() { return friendlyName; }
    public void setFriendlyName(String friendlyName)
        { this.friendlyName = friendlyName; }
}

В каталоге src/main/java/mypackage/domain/ (если вы используете Maven) вы должны поместить хороший, традиционный XML-файл сопоставления (Profile.hbm.xml):

<hibernate-mapping package="mypackage.domain" default-access="field">
<class name="Profile" table="Profile">
    <id name="id" column="ID">
        <generator class="native" />
    </id>
    <property name="friendlyName" column="FriendlyName" />
</class>
</hibernate-mapping>

Если вы используете Hibernate 4.0.0.CR3, который должен быть в порядке, конфигурация Spring (я использую 3.0.6.RELEASE) может тогда выглядеть как типичная конфигурация JPA Hibernate:

<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="jpaVendorAdapter">
    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
        <property name="database" value="SQL_SERVER" />
        <property name="showSql" value="true" />
    </bean>
    </property>
</bean>

META-INF/persistence.xml довольно простой и, для полноты здесь это:

<persistence version="1.0">
    <persistence-unit name="default" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>mypackage.domain.Profile</class>
    </persistence-unit>
</persistence>

Конечно, хотя я использую JPA, конфигурация отображения специфична для Hibernate, и поэтому я привязал себя к Hibernate в этом проекте, так как я использую чистый JDBC в унаследованном родственном проекте, я не вижу в этом такого недостатка.

1 голос
/ 15 мая 2010

Это возможно, но я не думаю, что это необходимо. Я работаю над множеством крупных проектов, многие именованные запросы которых привязаны к некоторым объектам, и я не думаю, что это сильно загромождает источник - ведь все запросы находятся перед определением класса. Основным преимуществом использования аннотаций является то, что вы можете видеть все в исходном коде. Если вы извлекли запросы в конфигурации xml, наличие именованных запросов не будет сразу видно, что я считаю недостатком. Мне нравится держать вещи в чистоте - либо настройка только xml, либо установка только аннотаций. Единственная конфигурация xml, которую я обычно сохраняю для проектов JPA в файле persistence.xml.

...