【问题标题】:Hibernate configuration - session factory scanning?休眠配置 - 会话工厂扫描?
【发布时间】:2010-03-10 19:15:57
【问题描述】:

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

【问题讨论】:

  • 不清楚这里说的是Java Hibernate还是.NET NHibernate……我猜是nhibernate标签不对吧?

标签: java hibernate orm hibernate.cfg.xml


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    怎么样?

    <mapping assembly="SomeAssemblyName" />
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          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 特定的类。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-10-21
            • 1970-01-01
            • 2015-08-22
            • 2016-01-27
            • 2011-02-01
            • 1970-01-01
            • 1970-01-01
            • 2015-03-18
            相关资源
            最近更新 更多