2013-05-05 7 views
7

In Spring 3.1 e versioni successive, LocalContainerEntityManagerFactoryBean è in grado di configurare JPA EntityManagerFactory senza un persistence.xml. La configurazione è invece inclusa nella definizione del bean per LocalContainerEntityManagerFactoryBean.Spring LocalContainerEntityManagerFactoryBean scanForPackages e Hibernate definizioni del tipo di pacchetto a livello di pacchetto

Quando utilizzo il metodo packagesToScan per indicare al bean factory dove cercare le mie classi di entità, sembra che non sia in grado di rilevare il mio Hibernate type definitions che sono definiti a livello di pacchetto.

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; 

primavera-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> 

C'è un modo per fare questo lavoro?

risposta

-1

Ho trovato che l'aggiunta di un'annotazione @MappedSuperclass al typedefs a livello di pacchetto fa sì che Hibernate li trovi e li elabori. Non sembra una soluzione molto carina, quindi sto ancora cercando un modo migliore se ne esiste uno.

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; 
+1

ho affrontato lo stesso problema. Ma come dici quando aggiungo @MappedSuperclass, otterrò il seguente errore di Maven --------> ERROR] core \ model \ package-info.java: [2,0] errore: tipo di annotazione non applicabile a questo tipo di dichiarazione – Channa