public void miseAJourTranscoIdCroisiere(Integer idCroisiereKaravel, String idCroisiereArmateur, TypeArmateur typeArmateur) { IdCroisiereKaravelArmateur idRelationship = new IdCroisiereKaravelArmateur(); idRelationship.setIdCroisiereKaravel(idCroisiereKaravel); idRelationship.setIdCroisiereArmateur(idCroisiereArmateur); idRelationship.setTypeArmateur(typeArmateur); entityManager.persist(idRelationship); }
Is this code fragment supposed to work by its name? This is no exception. However, he does nothing. I am more than confused with persistence in Java.
Since I cannot insert ... values ββwith hql, I have to do this with jpa directly, right?
I tried to do it this way , but I got it
java.lang.IllegalStateException: Not allowed to create transaction on shared EntityManager - use Spring transactions or EJB CMT instead at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:198) at $Proxy19.getTransaction(Unknown Source) at com.karavel.connectivity.gateway.croisiere.common.repository.impl.CatalogueKaravelRepositoryImpl.miseAJourTranscoIdCroisiere(CatalogueKaravelRepositoryImpl.java:56) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:196) at $Proxy23.miseAJourTranscoIdCroisiere(Unknown Source) at com.karavel.connectivity.gateway.croisiere.controller.service.RechercherCroisiereController.getItineraireCroisiere(RechercherCroisiereController.java:385) at com.karavel.connectivity.gateway.croisiere.controller.service.RechercherCroisiereController.obtenirListeCroisiere(RechercherCroisiereController.java:283) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426) at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560) at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.springframework.web.filter.AbstractRequestLoggingFilter.doFilterInternal(AbstractRequestLoggingFilter.java:193) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:291) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Thread.java:662)
So I thought about creating another EntityManager for this. But sinde is not a static method, I cannot use EntityManagerFactory.
Maybe so randomly doing a simple insertion in ddbb?
I'm sorry if I say stupid or confuse concepts, but I have two days of experience in Java persistence and Hibernate.
Edit to show my classes:
I need a transaction, but I cannot use it from a generic EntityManager (what does this mean?)
Do I need an EntityManager just for this method? If I do this, I cannot use EntityManagerFactory for static.
Sorry, I did not create this architecture. I'm just starting out with Spring and Hibernate, so for me here is a great mix ...
ApplicationContext:
<bean id="gateway.croisiere.catalogueKaravel.dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${gateway.croisiere.catalogueKaravel.driver.className}" /> <property name="url" value="${gateway.croisiere.catalogueKaravel.driver.url}" /> <property name="username" value="${gateway.croisiere.catalogueKaravel.driver.username}" /> <property name="password" value="${gateway.croisiere.catalogueKaravel.driver.password}" /> </bean> <bean id="gateway.croisiere.catalogueKaravel.entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="persistenceXmlLocation" value="classpath:/catalogueKaravel-persistence.xml" /> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="generateDdl" value="${gateway.croisiere.catalogueKaravel.hibernate.hbm2ddl.auto}" /> <property name="databasePlatform" value="${gateway.croisiere.catalogueKaravel.hibernate.dialect}" /> <property name="showSql" value="${gateway.croisiere.catalogueKaravel.hibernate.show_sql}" /> </bean> </property> <property name="dataSource" ref="gateway.croisiere.catalogueKaravel.dataSource" /> <property name="persistenceUnitName" value="gateway-croisiere-catalogueKaravel-persitence-unit" /> </bean> <bean id="gateway.croisiere.catalogueKaravel.transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="gateway.croisiere.catalogueKaravel.entityManagerFactory" /> <property name="defaultTimeout" value="${gateway.croisiere.catalogueKaravel.hibernate.transaction.timeout}" /> </bean> <tx:annotation-driven transaction-manager="gateway.croisiere.catalogueKaravel.transactionManager" />persistence: <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> <persistence-unit name="gateway-croisiere-catalogueKaravel-persitence-unit" transaction-type="RESOURCE_LOCAL"> <class>com.karavel.connectivity.gateway.croisiere.common.domain.cataloguekaravel.IdCroisiereKaravelArmateur</class> <class>com.karavel.connectivity.gateway.croisiere.common.domain.cataloguekaravel.CroisiereInfoCatalogueKaravel</class> <class>com.karavel.connectivity.gateway.croisiere.common.domain.cataloguekaravel.CroisiereOffreItineraireCatalogueKaravel</class> <class>com.karavel.connectivity.gateway.croisiere.common.domain.cataloguekaravel.EscaleCatalogueKaravel</class> <class>com.karavel.connectivity.gateway.croisiere.common.domain.cataloguekaravel.CroisiereItineraireCatalogueKaravel</class> </persistence-unit> </persistence>
Entity:
@Entity @Table(name="transco_idcroisierekaravel_idcroisierearmateur") public class IdCroisiereKaravelArmateur implements Serializable { private static final long serialVersionUID = -2764921376397148157L; @Id @GeneratedValue @Column(name="id") private Integer id; @Column(name="idCroisiereKaravel") private Integer idCroisiereKaravel; @Column(name="idCroisiereArmateur") private String idCroisiereArmateur; @Column(name="typeArmateur") @Enumerated(EnumType.STRING) private TypeArmateur typeArmateur; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getIdCroisiereKaravel() { return idCroisiereKaravel; } public void setIdCroisiereKaravel(Integer idCroisiereKaravel) { this.idCroisiereKaravel = idCroisiereKaravel; } public String getIdCroisiereArmateur() { return idCroisiereArmateur; } public void setIdCroisiereArmateur(String idCroisiereArmateur) { this.idCroisiereArmateur = idCroisiereArmateur; } public TypeArmateur getTypeArmateur() { return typeArmateur; } public void setTypeArmateur(TypeArmateur typeArmateur) { this.typeArmateur = typeArmateur; } }
Repository
@SuppressWarnings("unchecked") public class CatalogueKaravelRepositoryImpl implements CatalogueKaravelRepository { @PersistenceContext(unitName="gateway-croisiere-catalogueKaravel-persitence-unit") private EntityManager entityManager; @Override @Transactional public void miseAJourTranscoIdCroisiere(Integer idCroisiereKaravel, String idCroisiereArmateur, TypeArmateur typeArmateur) { IdCroisiereKaravelArmateur idRelationship = new IdCroisiereKaravelArmateur(); idRelationship.setIdCroisiereKaravel(idCroisiereKaravel); idRelationship.setIdCroisiereArmateur(idCroisiereArmateur); idRelationship.setTypeArmateur(typeArmateur); EntityManager em = getEntityManager();