2010-03-10 3 views
1

У нас есть этот файл hibernate.cfg.xml. Есть ли способ сказать Hibernate просто сканировать каталог вместо того, чтобы добавлять запись для каждого класса?Конфигурация 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> 
+0

Это не ясно, если вы говорите о Java Hibernate или .NET NHibernate здесь ... Я угадать, что тег nhibernate неверен? –

+0

Справа - исправлено это. –

ответ

0

Практика 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 возвращает имя вашей сборки, содержащей все ваши объекты домена, с соответствующими сопоставлениями. Затем, добавив это, вы добавляете сборку, и вам не нужно повторять процесс снова и снова для ваших типов доменов.

3

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

0

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

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

1

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

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

    боб ID = класс "SessionFactory" = "com.foo.EntityScannerSessionFactoryBean">

Смежные вопросы