休眠映射包

2022-09-01 01:09:23

我正在使用Hibernate Annotations。

在我所有的模型类中,我都这样注释:

@Entity
@Table
public class SomeModelClass {
//
}

我的冬眠.cfg.xml是

<hibernate-configuration>
   <session-factory>
      <!-- some properties -->

      <mapping package="com.fooPackage" />
      <mapping class="com.fooPackage.SomeModelClass" />
    </session-factory>
</hibernate-configuration>

对于我添加到com.fooPackage的每个类,我必须在休眠状态中添加一行.cfg.xml如下所示:

<mapping class="com.fooPackage.AnotherModelClass" />

有没有办法添加新的模型类,但不需要添加此行来休眠.cfg.xml?


答案 1

开箱即用 - 不。但是,您可以编写自己的代码来检测/注册带注释的类。如果您使用的是Spring,则可以扩展并执行以下操作:AnnotationSessionFactoryBean

@Override
protected SessionFactory buildSessionFactory() throws Exception {
  ArrayList<Class> classes = new ArrayList<Class>();

  // the following will detect all classes that are annotated as @Entity
  ClassPathScanningCandidateComponentProvider scanner =
    new ClassPathScanningCandidateComponentProvider(false);
  scanner.addIncludeFilter(new AnnotationTypeFilter(Entity.class));

  // only register classes within "com.fooPackage" package
  for (BeanDefinition bd : scanner.findCandidateComponents("com.fooPackage")) {
    String name = bd.getBeanClassName();
    try {
      classes.add(Class.forName(name));
    } catch (Exception E) {
      // TODO: handle exception - couldn't load class in question
    }
  } // for

  // register detected classes with AnnotationSessionFactoryBean
  setAnnotatedClasses(classes.toArray(new Class[classes.size()]));
  return super.buildSessionFactory();
}

如果你没有使用Spring(你应该是:-)),你可以编写自己的代码来检测适当的类,并用你的via方法注册它们。AnnotationConfigurationaddAnnotatedClass()

顺便说一句,除非您实际上在包级别声明了某些内容,否则没有必要映射包。


答案 2

我只是遇到这个问题,发现似乎有一个开箱即用的解决方案。我的集成尚未发布,稍后将对此进行更新。

从Javadoc,特别是部分:packagesToScan

org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean

Spring的标准LocalSessionFactoryBean for Hibernate的子类,支持用于映射的JDK 1.5 +注释元数据。

注意:此类需要 Hibernate 3.2 或更高版本,并存在 Java Persistence API 和 Hibernate Annotations 附加组件。

豆类定义示例:AnnotationSessionFactoryBean

<bean id="sessionFactory" 
      class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
  <property name="dataSource" ref="dataSource"/>
  <property name="annotatedClasses">
    <list>
      <value>test.package.Foo</value>
      <value>test.package.Bar</value>
    </list>
  </property>
</bean>

或者,当使用类路径扫描来自动检测实体类时:

<bean id="sessionFactory"
      class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
  <property name="dataSource" ref="dataSource"/>
  <property name="packagesToScan" value="test.package"/>
</bean>

自: 1.2.2
作者: Juergen Hoeller


推荐