2014-03-14 109 views
1

我是JPA,Hibernate以及Spring的新手。目前,我正在創建一個與大量表格一起使用的數據庫的spring web服務。要訪問這些表格,我創建了單獨的課程註釋@Entity。然後我創建了一個通用的DAO類,因爲我所有的實體都需要類似的操作。Spring JPA Hibernate處理大型數據庫

@Transactional 
public class GenericJpaDao<T, ID extends Serializable> { 

private Class<T> persistentClass; 

private EntityManager entityManager; 

public GenericJpaDao(Class<T> persistentClass) { 
    this.persistentClass = persistentClass; 
} 

protected EntityManager getEntityManager() { 
    return entityManager; 
} 

@PersistenceContext 
public void setEntityManager(EntityManager entityManager) { 
    this.entityManager = entityManager; 
} 

public Class<T> getPersistentClass() { 
    return persistentClass; 
} 

@Transactional(readOnly = true) 
public T findById(ID id) { 
    T entity = (T) getEntityManager().find(getPersistentClass(), id); 
    return entity; 
} 

@SuppressWarnings("unchecked") 
@Transactional(readOnly = true) 
public List<T> findAll() { 
    return getEntityManager().createQuery("select x from " + getPersistentClass().getSimpleName() + " x").getResultList(); 
} 

public T save(T entity) { 
    getEntityManager().persist(entity); 
    return entity; 
} 

public T update(T entity) { 
    T mergedEntity = getEntityManager().merge(entity); 
    return mergedEntity; 
} 

public void delete(T entity) { 
    entity = getEntityManager().merge(entity); 
    getEntityManager().remove(entity); 
} 

public void flush() { 
    getEntityManager().flush(); 
} 

} 

現在我試圖與相關Entitiy類實例化這個GenericJpaDao代碼爲persistentClass。但後來,因爲我通過datasource-config.xml根據我從我需要爲我所有的實體類獨立的DAO類提供的樣品瞭解其配置爲

<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml"></property> 
    <property name="persistenceUnitName" value="hibernatePersistenceUnit" /> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="showSql" value="true" /> 
     </bean> 
    </property> 
</bean> 

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 

所以我無法找到一個方法來設置entitiyManager和在spring-ws-servlet.xml中實例化它們。

<bean id="testDao" class="com.sample.dao.TestDao" /> 
    <bean id="service" 
    class="com.sample.service.DefaultService"> 
    <property name="testDao" ref="testDao" /> 
</bean> 

我認爲這將是從長遠來看,一個問題,因爲我需要在數據庫中的每個表中的兩個分離的類,在XML instaintiating他們,跟蹤所有的人都在我的服務類。是否有任何方法可以克服這一點或任何可用的最佳做法?

+0

提示:扔掉你的解決方案並使用[Spring Data JPA](http://projects.spring.io/spring-data-jpa/)。這樣你只需要聲明一些接口(不需要實現!)就可以添加一行xml配置來獲得所有你需要的dao。 –

回答

1

您不需要爲每個類創建特定的DAO。

但是您必須刪除構造函數並更改您的方法簽名以包含所需的persistentClass(或調用getClass的實例)。

基本上,您需要刪除persistentClass屬性並更改方法以從類型T或類的泛型參數動態使用類。

這樣你就有一個可以處理所有實體的spring spring DAO。

+0

感謝它爲我工作。 – Diluu