Insert ... value using entityManager.persist (Object);

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(); // begin transaction em.getTransaction().begin(); // persist object - add to entity manager em.persist(idRelationship); // flush em - save to DB em.flush(); // commit transaction at all em.getTransaction().commit(); } } 
+4
source share
3 answers

As indicated in the original question poster:


My decision:

In fact, the bean for the TranscationManager is not configured correctly. I took the first one found in the Spring configuration file. Since the audit system is working fine, I just used the same configuration. However, for another access to DDBB, he tried to use the Audit TransactionManager (the first of which is displayed in the configuration file)

Hope this helps someone. Sorry for such an ambiguous solution, but it was a few months ago, and I can no longer access this code.

+1
source

It seems your problem is simple: it wants a transaction. You are using Spring. The main reason to drag Spring into the persistence area is to get AOP-based nested transactions ..? You must be able to comment on your @Transaction method and run the TransactionManager either in your applicationContext.xml or through some other boot file.

+4
source

Yes, EntityManager#persist must be able to save records,

  • Your entity manager seems to throw a runtime exception, terminate it in a try catch Block

  • Make sure your class is declared in spring transaction, if you use annotation-based configuration then your class should be tagged @Transactional and your entityManager should be @PersistenceContext

+2
source

Source: https://habr.com/ru/post/1414381/


All Articles