【问题标题】:Hibernate config with JPA LocalContainerEntityManagerFactoryBean使用 JPA LocalContainerEntityManagerFactoryBean 进行休眠配置
【发布时间】:2014-03-27 20:03:59
【问题描述】:

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

Why would Hibernate ignore package-info.java?

答案说添加这个:

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

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

谢谢

【问题讨论】:

  • 好吧,尝试获取 Hibernate 配置并按照您提供的链接中的说明调用方法 configuration.addPackage
  • 问题是我使用的是 JPA 的 LocalContainerEntityManagerFactoryBean,它不是特定于休眠的。我不知道如何通过这个 JPA 接口访问休眠配置对象。

标签: java spring hibernate jpa


【解决方案1】:

在LocalContainerEntityManager中,有一个方法叫setPackagesToScan。试试这个方法。

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

【讨论】:

  • 感谢您的回复。我实际上是在春天这样设置的: 但它没有捡起它。它正在扫描该包下的所有实体,但不应用 package-info.java 注释。
【解决方案2】:

我发现 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
    }

【讨论】:

    【解决方案3】:

    只需同时使用 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>
    

    【讨论】:

    • 我正在尝试您的解决方案,但如果我的 persistence.xml 几乎为空,那么我的“packagesToScan”似乎不起作用。有什么想法吗?
    猜你喜欢
    • 2020-01-29
    • 1970-01-01
    • 2015-11-09
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多