Can I configure Hibernate to scan packages automatically to create a SessionFactory
from @Entity
annotated beans ?
Currently I am using
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;
}
No. You can't say Hibernate to scan packages for persistent classes even with the last Hibernate 5 version. Configuration
has method addPackage()
, but it is for reading "package-level metadata" (.package-info
- files).
You don't want to use Spring, so what can you do:
Using fluent-hibernate
You can use EntityScanner from fluent-hibernate library (you will not need to have other jars, except the library)
For Hibernate 4 and Hibernate 5:
Configuration configuration = new Configuration();
EntityScanner.scanPackages("my.com.entities", "my.com.other.entities")
.addTo(configuration);
SessionFactory sessionFactory = configuration.buildSessionFactory();
Using a new Hibernate 5 bootstrapping 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();
Using other libraries
If you already use a library that can be used for scanning, for an example Reflections, there is a test project with examples of using various libraries for entity scanning: hibernate-scanners-test.