Witam,
Mam klasę, która wykonuje proste operacje bazodanowe:
/**
* Creates elements
*/
@Transactional(readOnly = false, propagation=Propagation.REQUIRED)
public void create(Serializable newInstance) {
getEm().persist(newInstance);
}
/**
* Updates element
*/
@Transactional(readOnly = false, propagation=Propagation.REQUIRED)
public void update(Serializable objToUpdate) {
getEm().merge(objToUpdate);
}
konfiguracja springa (w wersji 3.2.4.RELEASE) wygląda tak:
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="dbProperties"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:db.properties" />
<!-- Allow other PropertyPlaceholderConfigurer to run as well -->
<property name="ignoreUnresolvablePlaceholders" value="true" />
</bean>
<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource"
id="dataSource">
<property value="${jdbc.driver}" name="driverClassName" />
<property value="${jdbc.url}" name="url" />
<property value="${jdbc.username}" name="username" />
<property value="${jdbc.password}" name="password" />
</bean>
<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="emf" />
<property name="jpaDialect" ref="jpaDialect" />
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="emf"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceXmlLocation" value="classpath*:/META-INF/persistence.xml" />
<property name="persistenceUnitName" value="default" />
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="databasePlatform" value="${dialect}" />
<property name="showSql" value="true" />
<property name="generateDdl" value="false" />
<property name="database" value="${db}" />
</bean>
</property>
</bean>
oraz konfiguracja persistence.xml :
<properties>
<property name="hibernate.archive.autodetection" value="class, hbm" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
<!-- Ehcache stuff -->
<property name="hibernate.cache.use_second_level_cache"
value="true" />
<property name="hibernate.cache.use_query_cache" value="true" />
<property name="hibernate.cache.region.factory_class"
value="org.hibernate.cache.ehcache.EhCacheRegionFactory" />
<property name="hibernate.generate_statistics" value="true" />
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider" />
<property name="hibernate.cache.provider_configuration_file_resource_path"
value="ehcache.xml" />
</properties>
OK. W czym problem? Jak wykonuję pierwszą metodę *create *wszystko działa ok. Idzie sql do bazy danych i w konsekwencji mam dodany rekord.
Hibernate: insert into.....
W przypadku metody update cisza. Nie rzuca żadnym błędem i nie widzę też w consoli, aby jakaś sql-ka szła do bazy. Tym samym baza pozostaje niezmieniona. Sama operacja NIBY kończy się sukcesem.
Jakieś sugestie? Typy? Coś jeszcze sprawdzić?
AHA. To że do merge wchodzą Serializable nie powinno mieć znaczenia. Sprawdzałem w innych aplikacjach i jakoś działa.
Shalom