Spring JPA Hibernate处理大型数据库

时间:2014-03-14 06:18:39

标签: java spring hibernate jpa spring-ws

我是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 Class作为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中实现它们,在我的服务类中跟踪所有这些类。有没有什么方法可以克服这个或任何最佳实践?

1 个答案:

答案 0 :(得分:1)

您不需要为每个类创建特定的DAO。

但是您必须删除构造函数并更改方法签名以包含所需的persistentClass(或您调用getClass的实例)。

基本上,您需要删除persistentClass属性并更改方法,以便从类型为T或Class的泛型参数中动态使用该类。

这样你就有了一个Spring管理的DAO,可以处理你所有的实体。