java hibernate.cfg.xml中的HibernateMap类

42fyovps  于 2022-12-21  发布在  Java
关注(0)|答案(2)|浏览(107)

对于来自hibernate.cfg.xml的类Map,我使用以下格式:
第一个月
如何使用一个Map行来Map包中的所有类?例如:使用bla-star的<mapping class="packageName.*"/>不起作用!

pwuypxnk

pwuypxnk1#

错误"解析XML时出错:hibernate2.cfg.xml(22)必须为元素类型"property"声明属性"value"-与包Map无关。
<mapping class="packageName.*"/>应该可以工作。
property元素存在问题。property元素没有任何名为value的属性。
试试看:

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

取代:

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

nom7f22z2#

据我所知,还没有直接的方法来扫描来自hibernate.cfg.xml的包,您可以使用其他框架,这些框架用自己的类来 Package 会话工厂创建。
例如,您可以在创建会话工厂示例时使用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;
    }
}

相关问题