当前位置: 首页 > 知识库问答 >
问题:

Spring LocalContainerEntityManagerFactoryBean扫描包和Hibernate包级别类型定义

笪波鸿
2023-03-14

在Spring 3.1及更高版本中,LocalContainerEntityManagerFactoryBean应该能够在没有persistence.xml.的情况下配置JPA EntityManagerFactory。

当我使用PackagesToScan方法告诉工厂bean在哪里扫描我的实体类时,它似乎没有获取在包级别定义的Hibernate类型定义。

package-info.java:

@org.hibernate.annotations.TypeDefs({
    @org.hibernate.annotations.TypeDef(name = "TypeA", typeClass = com.foo.type.A.class),
    @org.hibernate.annotations.TypeDef(name = "TypeB", typeClass = com.foo.type.B.class) }) package com.foo.type;

spring-jpa.xml:

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" lazy-init="true">
    <property name="dataSource" ref="dataSource" />
    <property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence"/>
    <property name="jpaVendorAdapter">
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
    </property>       
    <property name="jpaPropertyMap">
        <map>                               
            <entry key="hibernate.dialect" value="com.foo.FooDialect" />
            <entry key="hibernate.default_schema" value="dba"/>             
            <entry key="hibernate.cache.use_query_cache" value="false"/>
            <entry key="hibernate.cache.use_second_level_cache" value="true"/>
            <entry key="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory"/>
            <entry key="net.sf.ehcache.configurationResourceName" value="META-INF/ehcache.xml" />
            <entry key="javax.persistence.validation.factory" value-ref="validator"/>
        </map>
    </property>
    <property name="packagesToScan"> 
        <list>
            <value>com.foo.domain</value>
            <value>com.foo.type</value>
        </list>
    </property>             
</bean>

有没有办法让这一切顺利进行?

共有1个答案

匡晟
2023-03-14

我发现向包级别的typedefs添加@MappedSuperclass注释会导致Hibernate查找并处理它们。这似乎不是一个很好的解决方案,所以如果存在的话,我仍在寻找更好的方法。

package-info.java:

@MappedSuperclass // <---HACK TO CAUSE HIBERNATE TO NOTICE THESE TYPE DEFS
@TypeDefs({
    @TypeDef(name = "TypeA", typeClass = com.foo.type.A.class),
    @TypeDef(name = "TypeB", typeClass = com.foo.type.B.class) 
}) 
package com.foo.type;

import javax.persistence.MappedSuperclass;
 类似资料:
  • 我有理由相信SpringBoot至少不会扫描实体类,尽管实体位于主包的子包中。我让它与@ComponentScan注释一起工作,至少在某种程度上是这样。但是,我注意到另一个组件也没有运行。我相信这是一件非常简单的事情,因为这是一份来自不同软件包的非常接近的副本。 注意:我尝试添加@ComponentScan,@EntityScan,@EnableJpaRepository。这已经摆脱了最初的错误,

  • 本文向大家介绍详解spring自动扫描包,包括了详解spring自动扫描包的使用技巧和注意事项,需要的朋友参考一下 配置文件 前面的例子我们都是使用XML的bean定义来配置组件。在一个稍大的项目中,通常会有上百个组件,如果这些组件采用XML的bean定义来配置,显然会增加配置文件的体积,查找及维护起来也不太方便。 Spring2.5为我们引入了组件自动扫描机制,它可以在类路径底下寻找标注了@Co

  • 我认为以下代码可以工作: 但是我得到了一个编译器错误(见这里):

  • 我试图让我的日志使用log4j2和yaml工作,一直在挣扎。 这个包是com的。eclipse非常嘈杂,所以我只想在warn或更高级别记录来自该包的消息。对于我的软件包,我希望将调试及以上记录到滚动追加器,并将错误或以上记录到错误日志。在控制台上,我想看到除org之外的所有东西的debug。埃普利斯 使用当前配置,我看不到组织。eclipse调试消息,很好,我看到了com。myorganizati

  • 在spring boot应用程序中,我有一个包含应用程序类包,如 默认情况下,它自动从该类的包中设置ComponentScan。然后我有几个子包,每个子包包含几个组件和服务bean(使用注释)。但是为了对不同的用例重用这个应用程序,我需要启用/禁用一些子包中的所有组件,最好是通过一个属性。 那就是我有一些子包,比如 现在,基于某些属性,我想在其中一个包中启用(扫描)bean,例如。 我以为我可以使