对于来自hibernate.cfg.xml的类Map,我使用以下格式:第一个月如何使用一个Map行来Map包中的所有类?例如:使用bla-star的<mapping class="packageName.*"/>不起作用!
<mapping class="packageName.*"/>
pwuypxnk1#
错误"解析XML时出错:hibernate2.cfg.xml(22)必须为元素类型"property"声明属性"value"-与包Map无关。<mapping class="packageName.*"/>应该可以工作。property元素存在问题。property元素没有任何名为value的属性。试试看:
property
value
<property name="hibernate.archive.autodetection">class, hbm</property>
取代:
<property name="hibernate.archive.autodetection" value="class, hbm" />
nom7f22z2#
据我所知,还没有直接的方法来扫描来自hibernate.cfg.xml的包,您可以使用其他框架,这些框架用自己的类来 Package 会话工厂创建。例如,您可以在创建会话工厂示例时使用spring-orm扫描包。
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条答案
按热度按时间pwuypxnk1#
错误"解析XML时出错:hibernate2.cfg.xml(22)必须为元素类型"property"声明属性"value"-与包Map无关。
<mapping class="packageName.*"/>
应该可以工作。property
元素存在问题。property
元素没有任何名为value
的属性。试试看:
取代:
nom7f22z2#
据我所知,还没有直接的方法来扫描来自
hibernate.cfg.xml
的包,您可以使用其他框架,这些框架用自己的类来 Package 会话工厂创建。例如,您可以在创建会话工厂示例时使用
spring-orm
扫描包。或者你也可以编写自己的SessionFactoryWrapper。在创建SessionFactory时,你可以扫描包,然后在运行时添加它们。