Hibernate映射包

Dan*_*ura 39 java hibernate hibernate-annotations

我正在使用Hibernate Annotations.

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

@Entity
@Table
public class SomeModelClass {
//
}
Run Code Online (Sandbox Code Playgroud)

我的hibernate.cfg.xml是

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

      <mapping package="com.fooPackage" />
      <mapping class="com.fooPackage.SomeModelClass" />
    </session-factory>
</hibernate-configuration>
Run Code Online (Sandbox Code Playgroud)

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

<mapping class="com.fooPackage.AnotherModelClass" />
Run Code Online (Sandbox Code Playgroud)

有没有办法我可以添加新的模型类,但不需要将此行添加到hibernate.cfg.xml?

Chs*_*y76 18

开箱即用 - 没有.但是,您可以编写自己的代码来检测/注册带注释的类.如果您正在使用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();
}
Run Code Online (Sandbox Code Playgroud)

如果您不使用Spring(并且您应该:-)),您可以编写自己的代码来检测适当的类,并使用AnnotationConfigurationvia addAnnotatedClass()方法注册它们.

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


Jer*_*ian 11

我刚刚遇到这个问题,并发现似乎有一个开箱即用的解决方案.我的集成尚未完成,稍后会更新.

来自Javadoc,特别是packagesToScan部分:

org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean

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

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

AnnotationSessionFactoryBeanbean定义的示例:

<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>
Run Code Online (Sandbox Code Playgroud)

或者在使用类路径扫描进行实体类的自动检测时:

<bean id="sessionFactory"
      class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
  <property name="dataSource" ref="dataSource"/>
  <property name="packagesToScan" value="test.package"/>
</bean>
Run Code Online (Sandbox Code Playgroud)

自:1.2.2
作者:Juergen Hoeller


luk*_*uke 11

这里有一点线程坏死......

它看起来仍然不是一个很好的方法来做你想要的.如果你不想使用Spring,这里有一个使用Reflections的类似方法:

// Create your SessionFactory with mappings for every `Entity` in a specific package
Configuration configuration = new Configuration();
configuration.configure("your_hibernate.cfg.xml");

Reflections reflections = new Reflections("your_package");

Set<Class<?>> classes = reflections.getTypesAnnotatedWith(javax.persistence.Entity.class);

for(Class<?> clazz : classes)
{
    configuration.addAnnotatedClass(clazz);
}

ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
Run Code Online (Sandbox Code Playgroud)

对于其他Java反射库,相同的方法可能是可行的.