2014-03-14 50 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