Metoda EntityManager merge nie działa

0

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.

1

Zrob po merge flush i zobacz czy idzie sql

1

Może flush na entity managerze coś da? Bo on moze cacheować operacje i nie generować sqla od razu. Chociaż to jest mało prawdopodobne ;]

0

zapomniałem dodać, że rozwiązania z flush() też próbowałem i nic :(

0

Nie zaglebialem sie wiec nie wiem co nie dziala, ale wiem ze uzywac metody merge() w nieodpowiedni spob. Przeczytaj dokumentacja - hint: ona zwraca rezlultat ktory jest bardzo wazny zeby dzialalo z obiektami ktore sa detached; ty ignorujesz to co ona zwraca.

0

Ale mi wyszlo po polskiemu ;d

0

ok...mam. Patrzyłem na to kilka razy ale nie dochodziła do mnie myśl, że

@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)

że cache-uje sobie tą encję....palm face :)

Dzięki za podopowiedzi

1 użytkowników online, w tym zalogowanych: 0, gości: 1