1

我正在尝试让休眠模式扫描 package-info.java 文件,这样我就可以创建包级别的注释,而不必在每个实体中定义注释。我发现这篇文章提到了如何做到这一点:

为什么 Hibernate 会忽略 package-info.java?

答案说添加这个:

<mapping package="com.foo.bar.thepackage">

到我的休眠配置文件。但是,由于我只使用注释并使用 LocalContainerEntityManagerFactoryBean 我没有 Hibernate XML 文件。如何使用 jpa 工厂设置这个休眠特定属性?

谢谢

4

3 回答 3

0

我观察到与 Hibernate 4.3.1 和 Spring 4.0.2 相同的问题

我的解决方法是将 JPA 配置注释从 package-info.java 移动到其中一个类。

似乎这不起作用,因为DefaultPersistenceUnitManager#entityTypeFilters被初始化为仅具有以下 JPA 注释的过滤器类:

    entityTypeFilters = new LinkedHashSet<TypeFilter>(4);
    entityTypeFilters.add(new AnnotationTypeFilter(Entity.class, false));
    entityTypeFilters.add(new AnnotationTypeFilter(Embeddable.class, false));
    entityTypeFilters.add(new AnnotationTypeFilter(MappedSuperclass.class, false));
    try {
        @SuppressWarnings("unchecked")
        Class<? extends Annotation> converterAnnotation = (Class<? extends Annotation>)
                DefaultPersistenceUnitManager.class.getClassLoader().loadClass("javax.persistence.Converter");
        entityTypeFilters.add(new AnnotationTypeFilter(converterAnnotation, false));
    }
    catch (ClassNotFoundException ex) {
        // JPA 2.1 API not available
    }
于 2014-03-17T03:35:34.217 回答
0

只需同时使用 LocalContainerEntityManagerFactoryBean 和一个几乎为空的 persistence.xml 并为持久性单元使用与 LocalContainerEntityManagerFactoryBean 中相同的名称:

META-INF/persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
         xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name="sameAsInLocalContainerEntityManagerFactoryBean" transaction-type="RESOURCE_LOCAL">
    <!-- This is your package-info -->     
    <class>com.foo.bar.thepackage</class>        
    </persistence-unit> 
</persistence>
于 2014-03-27T12:03:59.967 回答
0

在 LocalContainerEntityManager 中,有一个名为 的方法setPackagesToScan。试试这个方法。

 LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
  factoryBean.setPackagesToScan("com.foo.bar.thepackage"); 
于 2013-09-19T08:18:04.023 回答