可以自动扫描包来自动创建SessionFactory吗?

时间:2016-02-06 19:45:26

标签: java hibernate hibernate-mapping

我是否可以将Hibernate配置为自动扫描包以从SessionFactory注释的bean创建@Entity

目前我正在使用

Configuration config = new Configuration() ;
config.addAnnotatedClass(MyEntity.class);

我不想使用hibernate.cfg.xml来配置映射。

请注意我想在不使用任何Spring或此类框架的普通Java项目中实现此目的。

之前使用Spring已经回答过类似的问题但是我想在不使用Spring或其他框架的情况下实现它。我对一些这样做的简单库开放。

2 个答案:

答案 0 :(得分:6)

没有。即使使用最后一个Hibernate 5版本,你也不能说Hibernate扫描包的持久化类。 Configuration有方法addPackage(),但它用于阅读"包级元数据" (.package-info - 文件)。

你不想使用Spring,所以你能做什么:

使用fluent-hibernate

你可以使用 来自EntityScanner库的fluent-hibernate(除了库之外,您不需要其他的罐子)

对于Hibernate 4和Hibernate 5:

Configuration configuration = new Configuration();
EntityScanner.scanPackages("my.com.entities", "my.com.other.entities")
    .addTo(configuration);
SessionFactory sessionFactory = configuration.buildSessionFactory();

使用新的Hibernate 5引导API:

List<Class<?>> classes = EntityScanner
        .scanPackages("my.com.entities", "my.com.other.entities").result();

MetadataSources metadataSources = new MetadataSources();
for (Class<?> annotatedClass : classes) {
    metadataSources.addAnnotatedClass(annotatedClass);
}

SessionFactory sessionFactory = metadataSources.buildMetadata()
    .buildSessionFactory();

使用其他图书馆

如果您已经使用了可用于扫描的库,例如Reflections,则有一个测试项目,其中包含使用各种库进行实体扫描的示例:hibernate-scanners-test

答案 1 :(得分:0)

 public static  ArrayList listfiles(String pckgname) {
       ArrayList classes=new ArrayList();
try{

    // Get a File object for the package 
    File directory=null; 
    try { 
      directory=new File(Thread.currentThread().getContextClassLoader().getResource(pckgname.replace('.', '/')).getFile()); 
    } catch(NullPointerException x) { 
      System.out.println("Nullpointer");
      throw new ClassNotFoundException(pckgname+" does not appear to be a valid package"); 
    } 
    if(directory.exists()) { 
      // Get the list of the files contained in the package 
      String[] files=directory.list(); 
      for(int i=0; i<files.length; i++) { 
// we are only interested in .class files 
if(files[i].endsWith(".class")) { 
  // removes the .class extension 
  classes.add(Class.forName(pckgname+'.'+files[i].substring(0, files[i].length()-6))); 
} 
      } 
    } else { 
System.out.println("Directory does not exist");
      throw new ClassNotFoundException(pckgname+" does not appear to be a valid package"); 
    } 
    Class[] classesA=new Class[classes.size()]; 
    classes.toArray(classesA); 

     //       return classesA;

} catch (Exception e) {
e.printStackTrace();
}
return classes;
}