【问题标题】:Insert ... value with entityManager.persist(Object);用 entityManager.persist(Object) 插入 ... 值;
【发布时间】:2012-05-25 13:58:57
【问题描述】:
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);
    }

这段代码 sn-p 应该自己工作吗?它不会抛出异常。然而它什么也没做。我对 Java 的持久性感到很困惑。

由于我不能用 hql 插入 ... 值,我应该直接用 jpa 来做,对吧?

我试过 in this way 但我明白了

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)

所以我考虑创建另一个 EntityManager 来执行此操作。但它不是静态方法,我不能使用 EntityManagerFactory。

在ddbb中做一个简单的插入会这么乱吗?

如果我说愚蠢或混淆概念,我很抱歉,但我在 Java 持久性和 Hibernate 方面有两天的经验。

编辑以显示我的课程:

我确实需要一个事务,但我无法从共享的 EntityManager 获得它(这是什么意思?)

我是否需要 EntityManager 来执行该方法?如果我这样做,我不能使用 EntityManagerFactory 来保持静态。

对不起,这不是我创建的架构。我刚开始使用 Spring 和 Hibernate,所以这里有很多组合...

应用程序上下文:

<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
@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;
    }
}

存储库

@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();   
    }
}

【问题讨论】:

  • 如果你能够自己解决问题,你应该写下来并接受这个答案!在 Stack Overflow 上,您真的不应该将答案作为问题的附录。

标签: java hibernate jpa persistence hql


【解决方案1】:

看起来您的问题很简单:它需要一笔交易。您正在使用 Spring。将 Spring 拖入持久化领域的主要原因是获得基于 AOP 的注入事务.. ?您应该能够注释您的方法 @Transaction 并在您的 applicationContext.xml 或通过其他引导程序启动 TransactionManager。

【讨论】:

  • 您好 Rob,感谢您的建议。问题是我认为这已经完成了。你能检查我的更新吗?
  • 你得到同样的错误?你为什么要手动进行交易(没关系,但是我没有理由在这里看到 Spring)?我怀疑你遇到了同样的错误。
  • 谢谢罗布。我手动进行交易,因为我真的不知道我在做什么......:P 我会尝试让它与 Spring 一起工作。感谢您的帮助。
  • 老兄,我没有敲它。坦率地说,仅注释的方法已经产生了一代人,他们不知道交易是什么,并认为有一个交易仙女。我正在努力提供帮助。您现在遇到不同的错误了吗?
  • 您好 Rob,非常感谢您的帮助。但我认为这里还有其他东西......我刚刚向我公司的 Java 架构师寻求帮助。从昨天开始他一直无法检测到这个问题,所以我猜任何配置文件中都有更深层次的东西。当我知道新的东西时,我会告诉你的。谢谢!
【解决方案2】:

是的,EntityManager#persist应该可以保存记录,

  1. 您的实体管理器坚持似乎正在抛出运行时异常,将其包装在 try catch 块中

  2. 确保你的类是在 spring 事务下声明的,如果你使用的是基于注解的配置,那么你的类应该被标记为 @Transactional 并且你的 entityManager 被标记为@PersistenceContext

【讨论】:

  • 嗨,mprabhat。是的,我正在使用 Annotation,我需要将类或方法标记为 Transactional 吗?
  • 你的类将被标记为 @Transactional 并且你的 EntityManager 应该有 @PersistenceContext 注释
  • 还是不行。 EntityManager.persist() 什么都不做。如果我 EntityManager.flush() 它要求进行交易。你能检查一下我在帖子中所做的更新吗?是否可以帮助您给我一个线索...非常感谢!
【解决方案3】:

正如问题的原始海报所述:


我的解决方案:

实际上,TranscationManager 的 bean 没有正确设置。我拿了在 Spring 配置文件中找到的第一个。由于审计系统工作正常,我只使用了相同的配置。但是,对于其他 DDBB 访问,它尝试使用 Audit TransactionManager(第一个出现在配置文件中)

我希望这对某人有所帮助。很抱歉这样一个模糊的解决方案,但这是几个月前的事了,我无法再访问代码了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 2011-10-13
    • 1970-01-01
    • 2012-06-15
    • 2016-04-30
    • 1970-01-01
    相关资源
    最近更新 更多