为什么我在使用注释时必须在hibernate.cfg.xml中声明每个类?

时间:2009-12-24 09:42:46

标签: java hibernate annotations

为什么仅设置@Entity注释是不够的?

我在这里忽略了这一点(表现?)?

感谢。

4 个答案:

答案 0 :(得分:7)

注释是不够的,因为如果没有某种明确的声明,hibernate不会知道带注释的类的存在位置。从理论上讲,它可以扫描类路径中的每个类并查找注释,但对于大型项目来说,这将非常昂贵。

你可以使用带有帮助程序的spring,它可以让你指定你的hibernate对象所在的包,它只会扫描这些包的@Entity。如果您将所有对象都包含在少量固定包中,则效果很好。

E.g。

  <bean id="referenceSessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="packagesToScan">
      <array>
        <value>com.xxx.hibernate.objects</value>
      </array>
    </property>
  </bean>

以上是Spring声明。如果您不熟悉上述语法,可以通过编程方式构建它。

AnnotationSessionFactoryBean sfb = new AnnotationSessionFactoryBean();
sfb.setDataSource( ds );
sfb.setHibernateProperties( hibProps);
sfb.setPackagesToScan( ... );
sfb.initialise();
SessionFactory sf = sfb.getObject();

它支持一堆配置选项,因此您可以使用原始属性或传入预配置的数据源。

答案 1 :(得分:3)

如果您将hibernate.archive.autodetection属性设置为true,则不会。这里存在性能问题,因为Hibernate将在jar文件中搜索JPA注释。请注意,它还会初始化这些类。

答案 2 :(得分:2)

是的:)

hibernate.cfg.xml文件不用于指定您的实体,它用于配置hibernate的连接参数和全局设置等内容。 hibernate.cfg.xml文件还包含有关如何查找实体的说明。您可以使用<mapping resource=XYZ>列出XML映射文件,但如果您使用的是@Entity等JPA注释,那么这是不必要的,Hibernate会自动检测它们。

如果您愿意,可以 混合注释和映射XML,但在大多数情况下这绝不是必需的。

答案 3 :(得分:1)

  

默认情况下所有正确注释   找到类和所有hbm.xml文件   存档内部添加到   持久性单元配置。您   可以通过添加一些外部实体   虽然是类元素。

Hibernate EntityManager Reference Docs