我是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中实现它们,在我的服务类中跟踪所有这些类。有没有什么方法可以克服这个或任何最佳实践?
答案 0 :(得分:1)
您不需要为每个类创建特定的DAO。
但是您必须删除构造函数并更改方法签名以包含所需的persistentClass(或您调用getClass的实例)。
基本上,您需要删除persistentClass属性并更改方法,以便从类型为T或Class的泛型参数中动态使用该类。
这样你就有了一个Spring管理的DAO,可以处理你所有的实体。