Как вывести Hibernate? - PullRequest
       39

Как вывести Hibernate?

1 голос
/ 05 июля 2011

Я работаю над веб-приложением на основе Java / Spring / Hibernate, разработанным в Eclipse.

Это веб-приложение на самом деле представляет собой два разных проекта, которые дублируют пару классов сущностей Hibernate, а также их соответствующие классы репозитория Hibernate.Очевидно, что было бы неплохо взять дублированный код и переместить его во внешний файл JAR или что-то в этом роде.

Из документации Hibernate я знаю, что должен поместить класс сущностей в новый JAVAпроект, который содержит persistence.xml файл.Я также знаю, что могу затем экспортировать этот проект в JAR и включить его в classpath моих основных проектов.Кроме того, я знаю, что я должен ссылаться на этот JAR из моего hibernate.cfg.xml в моем основном проекте.

По некоторым причинам, это не так просто с проектом, над которым я работаюпрямо сейчас.

Вот вопросы:

  1. в моем внешнем проекте, который содержит общий код, могу ли я также включить класс репозитория Hibernate?Как это должно быть отмечено в persistence.xml, если оно действительно должно быть вообще?

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

  3. Из документов Hibernate, я знаю, что могу сослаться на свойвнешний файл JAR с помощью тега <jar-file> в моем hibernate.cfg.xml.Так что, если в моем проекте нет hibernate.cfg.xml?У нас есть конфигурационный xml для Spring, который дает annotatedClasses свойство для org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean.Мне не повезло найти примеры ссылок на внешние JAR-файлы с помощью AnnotationSessionFactoryBean.

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

Заранее спасибо:)

РЕДАКТИРОВАТЬ:

ОК, так что похоже, что я в конечном итогенужно знать, предположим, что я включил "MY_TEST.jar" в мой путь к классу, и далее предположим, что "MY_TEST.jar" имеет один аннотированный класс Hibernate: src.shared.myEntity.java

Как мне сделать ссылку на этот класс сущности с помощью приведенного нижеОтрывок весенней конфигурации?(продолжаю получать IllegalArgumentException: Cannot find class почти независимо от того, что я пытаюсь)

<bean id="my.postgres.sessionFactory"
      class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

    <property name="dataSource"
        ref="my.postgres.dataSource" />

    <property name="annotatedClasses">
      <list>
        <value>src.app.EntityA</value>
        <value>src.app.EntityB</value>
      </list>
    </property>
    .........
</bean>

1 Ответ

0 голосов
/ 05 июля 2011

Hibernate не имеет концепции хранилища.Spring делает.

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

Организуйте свои проекты так, как вам хочется, и просто убедитесь, что у вас нет двух разных спящих режимов.конфигурационные файлы в classpath.Я бы использовал проект для хранения всех общих сущностей и, возможно, связанных с ними репозиториев, и позволил основному проекту определить файл конфигурации hibernate.

Если полное имя общего класса - src.shared.myEntity, то пружинаВ конфигурации должны быть следующие строки:

<property name="annotatedClasses">
  <list>
    ...
    <value>src.shared.myEntity</value>
  </list>
</property>

Ваша формулировка сбивает с толку, поэтому я проверю то, что я считаю очевидным, но, возможно, это не так.Полное имя класса состоит из полного имени пакета, за которым следует имя класса без расширения .class или .java.В банке должен быть файл .class, а не файл .java.Иерархия каталогов в банке должна точно отображать иерархию пакетов.Поэтому, если ваша сущность выглядит следующим образом:

package src.shared;

@Entity
public class myEntity {
    // ...
}

В корне должен быть каталог src, содержащий каталог shared, содержащий файл myEntity.class.

PS: иметь src в качестве имени корневого пакета действительно странно.Почему вы не соблюдаете соглашение: com.yourcompany.yourproject ...?

PPS: имя класса всегда должно начинаться с заглавной буквы: MyEntity, а не myEntity.

...