Add Annotated Class in Hibernate by adding all classes in some package. JAVA

As mentioned in the comments, the functionality of loading all classes in a package is not possible with the AnnotationConfiguration API. Here's some of the stuff you can do with said API (note that the "addPackage" method only reads package metadata, such as that found in the package-info.java class, it does NOT load all classes in package):

http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/ch01.html

sessionFactory = new AnnotationConfiguration()
                    .addPackage("test.animals") //the fully qualified package name
                    .addAnnotatedClass(Flight.class)
                    .addAnnotatedClass(Sky.class)
                    .addAnnotatedClass(Person.class)
                    .addAnnotatedClass(Dog.class)
                    .addResource("test/animals/orm.xml")
                    .configure()
                    .buildSessionFactory();

There is a nice open source package called "org.reflections". You can find it here: https://github.com/ronmamo/reflections

Using that package, you can scan for entities like this:

Reflections reflections = new Reflections("Tables.Informations");
Set<Class<?>> importantClasses = reflections.getTypesAnnotatedWith(Entity.class);
for (Class<?> clazz : importantClasses) {
    configuration.addAnnotatedClass(clazz);
}

The following code goes through all the classes within a specified package and makes a list of those annotated with "@Entity". Each of those classes is added into your Hibernate factory configuration, without having to list them all explicitly.

public static void main(String[] args) throws URISyntaxException, IOException, ClassNotFoundException {
    try {
        Configuration configuration = new Configuration().configure();
        for (Class cls : getEntityClassesFromPackage("com.example.hib.entities")) {
            configuration.addAnnotatedClass(cls);
        }
        sessionFactory = configuration.buildSessionFactory();
    } catch (Throwable ex) {
        System.err.println("Failed to create sessionFactory object." + ex);
        throw new ExceptionInInitializerError(ex);
    }
}

public static List<Class<?>> getEntityClassesFromPackage(String packageName) throws ClassNotFoundException, IOException, URISyntaxException {
    List<String> classNames = getClassNamesFromPackage(packageName);
    List<Class<?>> classes = new ArrayList<Class<?>>();
    for (String className : classNames) {
        Class<?> cls = Class.forName(packageName + "." + className);
        Annotation[] annotations = cls.getAnnotations();

        for (Annotation annotation : annotations) {
            System.out.println(cls.getCanonicalName() + ": " + annotation.toString());
            if (annotation instanceof javax.persistence.Entity) {
                classes.add(cls);
            }
        }
    }

    return classes;
}

public static ArrayList<String> getClassNamesFromPackage(String packageName) throws IOException, URISyntaxException, ClassNotFoundException {
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    ArrayList<String> names = new ArrayList<String>();

    packageName = packageName.replace(".", "/");
    URL packageURL = classLoader.getResource(packageName);

    URI uri = new URI(packageURL.toString());
    File folder = new File(uri.getPath());
    File[] files = folder.listFiles();
    for (File file: files) {
        String name = file.getName();
        name = name.substring(0, name.lastIndexOf('.'));  // remove ".class"
        names.add(name);
    }

    return names;
}

Helpful reference: https://stackoverflow.com/a/7461653/7255

Tags:

Java

Hibernate