2014-01-28 72 views
7

我正在使用Spring數據JPA 1.4.3.RELEASE與Hibernate 4.2.7.Final 我能夠成功地創建一個基本存儲庫類, : http://docs.spring.io/spring-data/jpa/docs/1.4.2.RELEASE/reference/html/repositories.html#repositories.custom-behaviour-for-all-repositories通用Spring數據JPA存儲庫實現按類類型加載數據

  @NoRepositoryBean 
      public interface BaseRepository <T extends BaseEntity, ID extends Serializable> 
      extends JpaRepository<T, ID> 

      @NoRepositoryBean 
      public class BaseRepositoryImpl<T extends BaseEntity, ID extends Serializable> 
      extends SimpleJpaRepository<T, ID> implements BaseRepository<T, ID> { 

我能夠與成功地工作:

  public interface FlowerRepository extends BaseRepository<Flower, Long> { 

現在,我試圖寫一個通用的實現(即擴展基礎資料庫)加載所有大參考喜歡花類型。 這是因爲我不想爲每個「類型」數據或「參考」數據建立一個存儲庫。 我想能夠管理,使用一個通用存儲庫通過傳遞一個特定的「類」類型(實現參考數據特定類型A接口)。對於EG

  loadAll(FlowerType.class) 

我用HBMS把Hibernate映射實體等等我有:

  <?xml version="1.0"?> 
      <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
      "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
      <hibernate-mapping> 
       <class name="xxx.FlowerType" table="FLWTYP"> 
       <meta attribute="extends" inherit="false">xxx.BaseReferenceType</meta> 
       <id name="primaryKey" type="string"> 
        <column name="TYP_CDE" length="5" /> 
        <generator class="assigned" /> 
       </id> 

      public class FlowerType extends BaseReferenceType<String> implements ReferenceEntity<String> 

      public abstract class BaseReferenceEntity<T extends Serializable> extends BaseEntity implements 
    ReferenceEntity<T> 

      public abstract class BaseEntity implements DomainEntity 

      public interface ReferenceEntity<PK extends Serializable> { 

持久性XML:

  <?xml version="1.0" encoding="UTF-8" standalone="no"?> 
      <persistence xmlns="http://java.sun.com/xml/ns/persistence" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" 
       xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
       <persistence-unit name="xxxPU" 
        transaction-type="RESOURCE_LOCAL"> 
        <provider>org.hibernate.ejb.HibernatePersistence</provider> 
        <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode> 
        <properties> 
         <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" /> 
         <property name="hibernate.hbm2ddl.auto" value="none" /> 
         <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy" /> 
         <property name="hibernate.connection.charSet" value="UTF-8" /> 
         <property name="hibernate.jdbc.batch_size" value="100" /> 
         <property name="hibernate.show_sql" value="false" /> 
         <property name="hibernate.format_sql" value="false" /> 
         <property name="hibernate.transaction.flush_before_completion" 
          value="false" /> 
         <property name="hibernate.connection.autocommit" value="false" /> 
         <property name="hibernate.ejb.cfgfile" value="hibernate.cfg.xml"/> 
         <property name="jadira.usertype.autoRegisterUserTypes" value="true" /> 
         <property name="jadira.usertype.databaseZone" value="jvm" /> 
         <property name="jadira.usertype.javaZone" value="jvm" /> 
        </properties> 
       </persistence-unit> 
      </persistence> 

Hibernate的配置:

  <?xml version="1.0" encoding="UTF-8"?> 
      <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
           "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 
      <hibernate-configuration> 
       <session-factory> 
        <mapping resource="FlowerType.hbm.xml"/> 
        <mapping resource="Flower.hbm.xml"/> 
       </session-factory> 
      </hibernate-configuration> 

所以我看了一些教程等環節的職位,做了一些工作基礎上:

Spring Jpa adding custom functionality to all repositories and at the same time other custom funcs to a single repository

我:

  @NoRepositoryBean 
      public interface CustomReferenceDataRepository<T extends BaseEntity & ReferenceEntity<PK>, PK extends Serializable> { 
       public Map<PK, T> findAll(Class<T> clz); 
      } 

      public interface ReferenceDataRepository extends BaseRepository, CustomReferenceDataRepository { 
      } 

      public class ReferenceDataRepositoryImpl<T extends BaseEntity & ReferenceEntity<PK>, PK extends Serializable> 
        implements CustomReferenceDataRepository<T, PK> { 

       @PersistenceContext 
       private EntityManager em; 


       @Override 
       public Map<PK, T> findAll(Class<T> clz) { 
       //do whatever 
        return null; 
       } 

      } 

結束了一個例外:

  Caused by: java.lang.IllegalArgumentException: Not an managed type: class xxx.BaseEntity 
       at org.hibernate.ejb.metamodel.MetamodelImpl.managedType(MetamodelImpl.java:200) ~[hibernate-entitymanager-4.2.7.Final.jar:4.2.7.Final] 
       at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.<init>(JpaMetamodelEntityInformation.java:68) ~[spring-data-jpa-1.4.3.RELEASE.jar:na] 
       at org.springframework.data.jpa.repository.support.JpaEntityInformationSupport.getMetadata(JpaEntityInformationSupport.java:65) ~[spring-data-jpa-1.4.3.RELEASE.jar:na] 
       at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getEntityInformation(JpaRepositoryFactory.java:146) ~[spring-data-jpa-1.4.3.RELEASE.jar:na] 

我知道Hibernate不管理「BaseE ntity「,但我無法弄清楚我缺少的東西。

我是否需要爲參考數據實現通用資源庫甚至可能? 如果是,我做錯了什麼? 任何指導讚賞。 謝謝。

+0

你可以粘貼你的JPA配置?已添加 –

+1

。謝謝.. – souser

回答

2

您必須添加映射BaseEntity還有:

<class name="xxx.BaseEntity " abstract="true"> 

您也可以嘗試使用註釋和剛剛成立packagesToScan屬性

+0

所有擴展BaseEntity的實體都應在baseentity標記內部聲明 –

+0

這是錯誤的。你必須映射你的基類和子類。您還可以嘗試使用註釋並只添加packagesToScan屬性 –

+0

我已經爲基類添加了映射。子類已經有一個映射。我的JUnit通過,看起來像它的工作,但需要測試更多。 – souser

相關問題