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

Java 为什么在使用注释时必须声明hibernate.cfg.xml中的每个类?,java,hibernate,annotations,Java,Hibernate,Annotations,为什么设置@Entity注释还不够 我是否遗漏了这里的要点,例如性能?如果您将hibernate.archive.autodetection属性设置为true,则不会遗漏。这里有一个性能问题,因为Hibernate将在jar文件中搜索JPA注释。请注意,它还将初始化这些类。注释是不够的,因为如果没有某种显式声明,hibernate不知道带注释的类位于何处。理论上,它可以扫描类路径中的每一个类并查找注释,但对于大型项目来说,这将非常昂贵 您可以使用spring,它有一个帮助器,允许您指定hiber

为什么设置@Entity注释还不够


我是否遗漏了这里的要点,例如性能?

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

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

您可以使用spring,它有一个帮助器,允许您指定hibernate对象所在的包,它只需扫描这些包中的@Entity。如果您将所有对象都放在少量固定包中,那么这很好

例如

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

是:)


hibernate.cfg.xml
文件不用于指定实体,而是用于配置诸如hibernate的连接参数和全局设置之类的内容。
hibernate.cfg.xml文件还包含有关如何定位实体的说明。您可以使用
列出XML映射文件,但是如果您使用像
@Entity
这样的JPA注释,那么这是不必要的,Hibernate将自动检测它们

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

默认情况下,所有已正确注释的 类和找到的所有hbm.xml文件 在归档文件中添加到 持久化单元配置。你 可以通过添加一些外部实体 但是类元素


“如果您使用的是像@Entity这样的JPA注释,那么这是不必要的,Hibernate将自动检测它们”——默认情况下,它显然不会这样做。如果我不告诉它类的情况,我会得到未注册的实体类型异常(我使用
AnnotationConfiguration.addAnnotatedClass
以编程方式告诉它它们)。不确定我做错了什么,但这并不是完全自动的。现在你也可以使用
LocalSessionFactoryBean
,它支持提供
hibernate.cfg.xml
文件,以备需要。我不确定spring的哪个版本获得了
setPackagesToScan
方法,但现在肯定有了。
  <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>
AnnotationSessionFactoryBean sfb = new AnnotationSessionFactoryBean();
sfb.setDataSource( ds );
sfb.setHibernateProperties( hibProps);
sfb.setPackagesToScan( ... );
sfb.initialise();
SessionFactory sf = sfb.getObject();