有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Hibernate从Hibernate映射类。cfg。xml

用于从hibernate进行类映射。cfg。xml我使用以下格式:

<mapping class="packageName.className1"/>
<mapping class="packageName.className2"/>
<mapping class="packageName.className3"/>

如何使用一个映射行映射包中的所有类? 例如:<mapping class="packageName.*"/>使用bla-star不起作用


共 (2) 个答案

  1. # 1 楼答案

    据我所知,没有直接的方法来扫描来自hibernate.cfg.xml的包。您可以使用其他框架,将会话工厂创建包装到它们自己的类中

    例如,在创建会话工厂实例时,可以使用spring-orm扫描包

    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="your-own-datasource"/>
        <property name="configLocation" value="classpath*:hibernate.cfg.xml"/>
        <property name="packagesToScan" value="your.package.name"/>
    </bean>
    

    或者您可以编写自己的SessionFactoryWrapper。在创建SessionFactory时,您可以扫描包,然后在运行时添加它们

    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<Class> 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;
        }
    }
    
  2. # 2 楼答案

    错误“解析XML时出错:hibernate2.cfg.XML(22)必须为元素类型“property”声明属性“value”——与包映射无关

    <mapping class="packageName.*"/>应该有效

    问题在于property元素。 property元素没有任何名为value的属性

    尝试:

    <property name="hibernate.archive.autodetection">class, hbm</property>
    

    而不是:

    <property name="hibernate.archive.autodetection" value="class, hbm" />