Spring LocalContainerEntityManagerFactoryBean scanForPackages and Hibernate Package Type Definitions

In Spring 3.1 and later, LocalContainerEntityManagerFactoryBean must be configured for JPA EntityManagerFactory without persistence.xml. Configuration is included in the bean definition for LocalContainerEntityManagerFactoryBean.

When I use the packagesToScan method to tell the factory bean where to scan my entity classes, it does not seem to raise my hibernation type definitions that are defined at the package level.

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> 

Is there any way to make this work?

+7
source share
1 answer

I found that adding @MappedSuperclass annotation to the package level typedefs causes Hibernate to find and process them. This doesn't seem like a very pretty solution, so I'm still looking for a better way if it exists.

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; 
-one
source

All Articles