Hibernate配置 - 会话工厂扫描?

时间:2010-03-10 19:15:58

标签: java hibernate orm hibernate.cfg.xml

我们有这个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 个答案:

答案 0 :(得分:3)

要获得发现机制,您需要使用Hibernate EntityManager来实现Java Persistence标准发现机制。否则你需要列出你的课程。

答案 1 :(得分:2)

怎么样?

<mapping assembly="SomeAssemblyName" />

答案 2 :(得分:1)

我正在寻找类似的解决方案,并从另一个question here找到答案。 你应该使用spring来完成这项工作。

  1. 创建一个类 EntityScannerSessionFactoryBean ,扩展 AnnotationSessionFactoryBean
  2. 从链接中复制代码(这是一个很好的答案,请确保您阅读它)。到你的新班。
  3. 添加以下内容,将该类映射为应用程序上下文中的sessionFactory。
      

    bean id =“sessionFactory”class =“com.foo.EntityScannerSessionFactoryBean”&gt;

答案 3 :(得分:0)

NHibernate的最佳做法是在构建ISessionFactory API之前仅向配置中添加一个程序集。

罗伯特确实用元素指出了它。

另一种方法是按如下方式执行运行时配置:

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返回包含所有域对象的程序集的名称,并使用正确的映射。然后,添加它,添加程序集,您不需要一次又一次地为您的域类型重复该过程。

答案 4 :(得分:0)

Tapestry使用实用程序类执行此操作,该实用程序类检查类路径以查找包含所有Hibernate注释类的包,然后检查磁盘上的文件以获取类名。如果你把它们全部放在一个包中(或者愿意编写一个更复杂的类路径实用程序),你可以找到它们,然后调用configuration.addAnnotatedClass(cls)。有一些警告,例如,你不能太喜欢外部罐子,加载自定义加载器的类等,但对于标准情况,它工作正常。

你可以看看Tapestry在这里做了什么:http://www.java2s.com/Open-Source/Java-Document/Library/Tapestry/org/apache/tapestry/internal/services/ClassNameLocatorImpl.java.htm虽然这可能会引入其他Tapestry特定的类。