Конфигурация Hibernate - сканирование фабрики сеанса? - PullRequest
1 голос
/ 10 марта 2010

У нас есть этот файл hibernate.cfg.xml. Есть ли способ сказать Hibernate просто сканировать каталог вместо того, чтобы добавлять сюда запись для каждого класса?

<hibernate-configuration>
   <session-factory>
      <mapping class="com.abc.domain.model.A" />
      <mapping class="com.abc.domain.model.B" />
      <mapping class="com.abc.domain.model.C" />
      <mapping class="com.abc.domain.model.D" />
      <mapping class="com.abc.domain.model.E" />
   </session-factory>
</hibernate-configuration>

Ответы [ 5 ]

3 голосов
/ 11 марта 2010

Чтобы получить механизм обнаружения, вам нужно использовать Hibernate EntityManager, который реализует стандартный механизм обнаружения Java Persistence. В противном случае вам нужно перечислить ваши классы.

2 голосов
/ 10 марта 2010

А как же?

<mapping assembly="SomeAssemblyName" />
1 голос
/ 06 октября 2011

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

  1. Создание класса EntityScannerSessionFactoryBean расширение AnnotationSessionFactoryBean
  2. Скопируйте код из ссылки (отличный ответ, обязательно прочитайте его). в ваш новый класс.
  3. Добавьте ниже, чтобы отобразить этот класс как sessionFactory в контексте вашего приложения.

    bean id = "sessionFactory" class = "com.foo.EntityScannerSessionFactoryBean">

0 голосов
/ 11 марта 2010

Tapestry делает это с помощью служебного класса, который проверяет путь к классам, чтобы найти пакеты, которые содержат все аннотированные классы Hibernate, а затем проверяет файлы на диске, чтобы получить имена классов. Если вы согласны с тем, что все они живут в одном пакете (или хотите написать более сложную утилиту classpath), вы можете найти их все и затем вызвать configuration.addAnnotatedClass (cls). Существуют предостережения, например, вы не можете слишком увлекаться внешними jar-файлами, классами, загруженными с помощью пользовательских загрузчиков и т. Д., Но для стандартного случая это работает нормально.

Вы можете посмотреть, как Гобелен делает это здесь: http://www.java2s.com/Open-Source/Java-Document/Library/Tapestry/org/apache/tapestry/internal/services/ClassNameLocatorImpl.java.htm, хотя это может привлечь другие классы, связанные с Гобеленом.

0 голосов
/ 10 марта 2010

Лучшей практикой NHibernate является добавление в конфигурацию только сборки перед сборкой API-интерфейса ISessionFactory.

Роберт указал на это элементом.

Другим способом было бы выполнить настройку во время выполнения следующим образом:

Configuration cfg = new Configuration();
cfg.AddAssembly(typeof(OneOfYourDomainType).Assembly.Name); // Or something like that by memory.
cfg.Configure();
static ISessionFactory sessionFactory = cfg.BuildSessionFactory();

Создание статического объекта ISessionFactory очень важно, поскольку создание экземпляра очень дорого.

typeof (OneOfYourDomainType) .Assembly.Name возвращает имя вашей сборки, содержащей все ваши доменные объекты, с соответствующими сопоставлениями. Затем, добавив это, вы добавляете сборку, и вам не нужно повторять процесс снова и снова для типов вашего домена.

...