Transakcja w JPA nie zapisuje danych do bazy danych, brak komunikatów o błędzie.

0

Mam problem z zapisywaniem danych do bazy MySQL w Spring MVC. Najgorsze jest to że nie wywala mi żadnych błędów i nie mogę się połapać o co chodzi. Po prostu servlet się odpala, ale do bazy nic się nie zapisuje.

Tu jest metoda, która ma zapisywać do bazy danych:

@PersistenceContext
	private EntityManager entityManager;

	@Transactional(propagation=Propagation.REQUIRED)
	public void saveCustomerAccount(Customer customer) {
		
		entityManager.persist(customer);
	}

Przy tej metodzie znajduje się znacznik, który spotykam pierwszy raz. Jego treść wygląda tak:

Multiple markers at this line
	- advised by 
	 org.springframework.transaction.interceptor.TransactionInterceptor.invoke(org.aopalliance.intercept.MethodInvocation)
	- Method breakpoint:CustomerAccountRepository [entry] - saveCustomerAccount(Customer)

I jeszcze jedna sprawa... gdybym czasem chciał zapisać coś do bazy danych i nie użył bym w tym celu transakcji to nie powinno mi wywalić błędu? A gdy usunę adnotacje Transactional to żadnego błędu nie mam.

1

Masakra...

  1. Jaki znów servlet w Spring MVC? o_O
  2. Wiesz że dzwonią, ale nie wiesz w którym kościele. Uzyłeś złej adnotacji transactional, to raz. Bo ta której użyłeś jest z JEE/EJB a nie ze Springa.
    Miałeś użyć org.springframework.transaction.annotation.Transactional
  3. Poza tym pokaż context.xml i persistence.xml bo trudno zgadywać w ciemno czy poprawnie skonfigurowałeś JPA i JTA.
  4. Gdybyś faktycznie spróbował coś zapisać do bazy bez otwartej transakcji to dostałbyś błąd.
0

Miałeś użyć org.springframework.transaction.annotation.Transactional

Takiej też użyłem.

persistence.xml:

 <persistence-unit name="hairdresserProgram" transaction-type="RESOURCE_LOCAL">
 	<provider>org.hibernate.ejb.HibernatePersistence</provider>
 	<class>pl.project.model.Customer</class>
 </persistence-unit>
 </persistence>

servlet-context.xml

<annotation-driven/>

	
	<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
	<resources mapping="/resources/**" location="/resources/" />

	<context:component-scan base-package="pl.hairdress.controller" />
	<context:component-scan base-package="pl.project.resorcue" />
	<context:component-scan base-package="pl.project.services" />

root-context.xml

<tx:annotation-driven transaction-manager="transactionManager" />	
			
		<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" 
	 		p:entityManagerFactory-ref="entityMenager"
	 	/>
	
		<bean id="entityMenager"
		  class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
		  p:dataSource-ref="dataSource" 
		  p:persistenceXmlLocation="/WEB-INF/spring/persistence.xml"/>
	
		<bean id="velocityConfig"
	        class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
	        <property name="resourceLoaderPath" value="/WEB-INF/views" />
	    </bean>
	    
	    <bean id="viewResolver"
	        class="org.springframework.web.servlet.view.velocity.VelocityLayoutViewResolver">
	        <property name="contentType" value="text/html; charset=UTF-8" />
	        <property name="cache" value="false" />
	        <property name="prefix" value="" />
	        <property name="layoutUrl" value="layout.vm"/>
	        <property name="suffix" value=".vm" />
	    </bean>
	    
	    <bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
        p:location="/WEB-INF/spring/database.properties">
   		</bean>
   		
   
	    
	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"
	p:url="${db.url}"
	p:driverClassName="${db.driverClassName}"
	p:username="${db.username}"
	p:password="${db.password}"
	/>

Dodam że odczytywanie z bazy danych za pomocą Entity Managera działa bez zarzutów.

1

Ok, mała prośba i rada ode mnie: kup sobie słownik. Poważnie. Bo jak raz piszesz:
transactionManager a obok entityMenager to nie wierzę że się gdzieś nie pomylisz...
Tak samo z pl.project.resorcue -> poważnie masz ten pakiet z błędem? czy może jednak pakiet to resources a błędnie wpisałeś go w konfiguracji tylko (i stąd ci nie działa...)?

Konfiguracja wygląda na pierwszy rzut oka poprawnie. Jesteś pewien że te klasy z twoim dao (tam gdzie masz te operacje na bazie) łapią się na:

    <context:component-scan base-package="pl.hairdress.controller" />
    <context:component-scan base-package="pl.project.resorcue" />
    <context:component-scan base-package="pl.project.services" />

?
Bo inaczej to nie zabangla.

0

Ok, mała prośba i rada ode mnie: kup sobie słownik. Poważnie. Bo jak raz piszesz:
transactionManager a obok entityMenager to nie wierzę że się gdzieś nie pomylisz...
Tak samo z pl.project.resorcue -> poważnie masz ten pakiet z błędem?

Heheh tak wiem...

Tak klasę z adnotacją @Repository, która zawiera wszystkie metody z operacją na bazie znajduje się w pakiecie pl.project.resorcue (resources) :-P. Pobieranie z bazy danych działa a metoda pobierania znajduje się w tej samej klasie więc chyba dobrze. Ale tak jak pisałem wcześniej o tym dziwnym znaczniku, z tekstem:

Multiple markers at this line
    - advised by 
     org.springframework.transaction.interceptor.TransactionInterceptor.invoke(org.aopalliance.intercept.MethodInvocation)
    - Method breakpoint:CustomerAccountRepository [entry] - saveCustomerAccount(Customer)

Ten znacznik znajduje się przy mojej metodzie do zapisywania do bazy danych, przy <context:component-scan base-package="pl.project.resorcue" /> i przy <tx:annotation-driven transaction-manager="transactionManager" />. Może to być przyczyną moich problemów?

0

Ja pierdziele jaki nieogar nie łatwiej wygenerować nowy projekt z archetypu lub spring starter

0

Ok użycie SessionFactory też nic nie daje... działa mi jedynie SimpleJDBC ale wszelkie sposoby mapowań nie przynoszą efektów.

Dobra dzięki za chęci pomocy, ale będę sobie musiał z tym sam poradzić bo to jakiś głupi błąd, którego na odległość się raczej nie zidentyfikuje.

1

Nie nie, ten marker jest ok. Po prostu pokazuje ci tam że masz zapięte AOP z transakcją i jednocześnie dałeś tam breakpointa a eclipse nie umie wyświetlić 2 makerków na raz i stąd taki komunikat.

A może problem jest zupełnie gdzie indziej. Czy debuger ci tam wchodzi poprawnie? Włączyłbym na twoim miejscu logowanie hibernate żeby widzieć jakie zapytania lecą do bazy.

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