1

我们有这个 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>
4

5 回答 5

3

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

于 2010-03-10T22:04:34.010 回答
2

关于什么?

<mapping assembly="SomeAssemblyName" />
于 2010-03-10T19:23:32.720 回答
1

我一直在寻找类似的解决方案,并从此处的另一个问题中找到了答案。您应该使用弹簧来完成这项工作。

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

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

于 2011-10-06T07:18:03.150 回答
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 返回包含所有域对象的程序集的名称,并具有正确的映射。然后,添加这个,您添加程序集,您不需要为您的域类型一次又一次地重复该过程。

于 2010-03-10T19:32:44.840 回答
0

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

您可以在这里查看 Tapestry 是如何做到的: http ://www.java2s.com/Open-Source/Java-Document/Library/Tapestry/org/apache/tapestry/internal/services/ClassNameLocatorImpl.java.htm虽然这可能引入其他 Tapestry 特定的类。

于 2010-03-11T02:22:43.520 回答