Hibernate Mapping Package

后端 未结 6 1130
深忆病人
深忆病人 2020-11-28 07:34

I\'m using Hibernate Annotations.

In all my model classes I annotate like this:

@Entity
@Table
public class SomeModelClass {
//
}

M

6条回答
  •  孤城傲影
    2020-11-28 08:16

    If you do not want to use spring or any other library, you can achieve that like this. Same approach as luke's but without Reflections library

    import org.hibernate.SessionFactory;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.service.ServiceRegistry;
    
    import javax.persistence.Entity;
    import javax.tools.FileObject;
    import javax.tools.JavaFileObject;
    import javax.tools.StandardJavaFileManager;
    import javax.tools.StandardLocation;
    import javax.tools.ToolProvider;
    import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Collections;
    import java.util.regex.Pattern;
    import java.util.stream.Collectors;
    import java.util.stream.StreamSupport;
    
    public class SessionFactoryWrapper {
    
        private final SessionFactory sessionFactory;
    
        public SessionFactoryWrapper(final String...packagesToScan) {
            this.sessionFactory = this.createSessionFactory(packagesToScan);
        }
    
        private SessionFactory createSessionFactory(final String[] packagesToScan) {
            final Configuration configuration = new Configuration();
            configuration.configure(); // Reads hibernate.cfg.xml from classpath
    
            for (String packageToScan : packagesToScan) {
                this.getEntityClasses(packageToScan).stream().forEach( configuration::addAnnotatedClass);
            }
    
            final ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
            return configuration.buildSessionFactory(serviceRegistry);
        }
    
        private Collection getEntityClasses(final String pack) {
            final StandardJavaFileManager fileManager = ToolProvider.getSystemJavaCompiler().getStandardFileManager(null, null, null);
            try {
                return StreamSupport.stream(fileManager.list(StandardLocation.CLASS_PATH, pack, Collections.singleton(JavaFileObject.Kind.CLASS), false).spliterator(), false)
                        .map(FileObject::getName)
                        .map(name -> {
                            try {
                                final String[] split = name
                                        .replace(".class", "")
                                        .replace(")", "")
                                        .split(Pattern.quote(File.separator));
    
                                final String fullClassName = pack + "." + split[split.length - 1];
                                return Class.forName(fullClassName);
                            } catch (ClassNotFoundException e) {
                                throw new RuntimeException(e);
                            }
    
                        })
                        .filter(aClass -> aClass.isAnnotationPresent(Entity.class))
                        .collect(Collectors.toCollection(ArrayList::new));
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    
        public SessionFactory getSessionFactory() {
            return sessionFactory;
        }
    }
    

提交回复
热议问题