HibernateTransactionManager lub JpaTransactionManager

Tworzenie aplikacji z przyjacielem, ale wpadł na pytanie... Miałem ten kod:

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation">
        <value>classpath:hibernate.cfg.xml</value>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${jdbc.dialect}</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>
        </props>
    </property>
</bean>

<tx:annotation-driven />
<bean id="transactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="dataSource" ref="dataSource" />
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

I usunął wszystko, zmienił na:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="persistenceUnit"/>
    <property name="dataSource" ref="dataSource"/>
</bean>

Powiedział, że jest to lepsze podejście, ale nie dokładnie wyjaśnić, dlaczego. Coś o tym, że nie używamy hibernate bezpośrednio, czy to oznacza, że w ogóle nie używamy hibernate? Czy to naprawdę lepsze podejście?

DAO zmienił się tak:

Miałem:

@Autowired
private SessionFactory sessionFactory;

public void addUser(User user) {
    sessionFactory.getCurrentSession().save(user);
}

Teraz jest:

@PersistenceContext
private EntityManager entityManager;

public void addUser(User user) {
    entityManager.persist(user);
}
Author: Jaanus, 2012-09-09

1 answers

Chce, aby Twój kod był zależny od JPA, a nie Hibernate. javax.persistence.EntityManager jest standardowym interfejsem JPA (Java EE), podczas gdy org.hibernate.SessionFactory jest interfejsem właściwości Hibernate. Przejście z SessionFactory do EntityManager sprawia, że Twoje klasy nie są już zależne od Hibernate. Korzystanie z JPA-way zamiast Hibernate-way jest obecnie uważane za najlepszą praktykę przez większość ludzi.

Pamiętaj, że Twój system jest nadal zależny od Hibernate, ponieważ potrzebujesz dostawcy JPA. Ale jeśli chcesz zmienić na kolejny dostawca JPA w przyszłości powinien być dość prosty. Kolejną zaletą JPA jest to, że interfejsy JPA są bardziej stabilne niż Interfejsy hibernowane.

 47
Author: Aleksander Blomskøld,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-09 09:17:02