Spring JPA Hibernate обрабатывает большие базы данных

1

Я новичок в JPA, Hibernate и Spring. В настоящее время я создаю весенний веб-сервис, который работает с базой данных с большим количеством таблиц. Чтобы получить доступ к этим таблицам, я создал отдельный класс, аннотирующий @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, отслеживать все из них в моем классе обслуживания. Есть ли способ преодолеть эту или любую лучшую практику?

Теги:
spring
hibernate
jpa
spring-ws

1 ответ

1
Лучший ответ

Вам не нужно создавать определенный DAO для каждого из ваших классов.

Но вам придется удалить конструктор и изменить сигнатуры методов, чтобы включить необходимый persistentClass (или экземпляр, в который вы вызываете getClass).

В основном вам нужно удалить свойство persistentClass и изменить методы динамического использования класса из общего параметра типа T или класса.

Таким образом, у вас есть ОДНА весна, управляемая DAO, которая может обрабатывать все ваши сущности.

  • 0
    Спасибо, это сработало для меня.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню