使用JPA LocalContainerEntityManagerFactoryBean的Hibernate配置

时间:2013-09-17 14:47:58

标签: java spring hibernate jpa

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

Why would Hibernate ignore package-info.java?

答案说补充一点:

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

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

由于

3 个答案:

答案 0 :(得分:0)

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

 LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
  factoryBean.setPackagesToScan("com.foo.bar.thepackage"); 

答案 1 :(得分: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
    }

答案 2 :(得分: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>