簡體   English   中英

Spring JPA Hibernate處理大型數據庫

[英]Spring JPA Hibernate handle large databases

我是JPA,Hibernate和Spring的新手。 當前,我正在創建一個Spring Web服務,該服務可用於具有大量表的數據庫。 為了訪問這些表,我創建了一個單獨的類@Entity 然后我創建了一個通用的DAO類,因為我的所有實體都需要類似的操作。

@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();
}

}

現在,我試圖實例化這個GenericJpaDao與相關Entitiy類的代碼persistentClass 但是后來我找不到一種設置entitiyManager的方法,因為我是通過datasource-config.xml將其配置為

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

因此,根據我從可用示例中了解的信息,我需要為所有實體類創建單獨的DAO類,並在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中實例化它們,並在我的服務類中跟蹤所有這些類。 是否有任何方法可以克服這一問題或可用的最佳實踐?

您無需為每個類創建一個特定的DAO。

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

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

這樣,您將擁有一個能夠處理所有實體的spring托管DAO。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM