Java 如何使用entitymaneger.merge(T实体)SpringMVC、jpa Hibernate

Java 如何使用entitymaneger.merge(T实体)SpringMVC、jpa Hibernate,java,spring,hibernate,spring-data-jpa,Java,Spring,Hibernate,Spring Data Jpa,我不明白它是如何工作的请帮助! 当我使用Crudepository时,一切都很好: @Transactional public Contact save(Contact contact) { contactRepository.save(contact); } <tx:annotation-driven transaction-manager="transactionManager"/> <bean id="e

我不明白它是如何工作的请帮助! 当我使用Crudepository时,一切都很好:

    @Transactional
        public Contact save(Contact contact) {
            contactRepository.save(contact);
        }
<tx:annotation-driven transaction-manager="transactionManager"/>

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="persistenceUnitName" value="appPu"/>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
    </property>
    <property name="packagesToScan" value="com.myProject.myMvcProject"/>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.dialect">
                org.hibernate.dialect.H2Dialect
            </prop>
            <prop key="hibernate.max_fetch_depth">3</prop>
            <prop key="hibernate.jdbc.fetch_size">50</prop>
            <prop key="hibernate.jdbc.batch_size">10</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>

<tx:annotation-driven/>
<context:annotation-config/>

<context:component-scan base-package="com.myProject.myMvcProject"/>

<jpa:repositories base-package="com.myProject.myMvcProject"
                  entity-manager-factory-ref="emf"
                  transaction-manager-ref="transactionManager"/>


</beans>
但当我使用自己的方法时:

    @Transactional
    public Contact save(Contact contact) {
    if (contact.getid() == null) {
        em.persist(contact);
        return contact;
    } else {
        return em.merge(contact);
    }
}
<tx:annotation-driven transaction-manager="transactionManager"/>

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="persistenceUnitName" value="appPu"/>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
    </property>
    <property name="packagesToScan" value="com.myProject.myMvcProject"/>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.dialect">
                org.hibernate.dialect.H2Dialect
            </prop>
            <prop key="hibernate.max_fetch_depth">3</prop>
            <prop key="hibernate.jdbc.fetch_size">50</prop>
            <prop key="hibernate.jdbc.batch_size">10</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>

<tx:annotation-driven/>
<context:annotation-config/>

<context:component-scan base-package="com.myProject.myMvcProject"/>

<jpa:repositories base-package="com.myProject.myMvcProject"
                  entity-manager-factory-ref="emf"
                  transaction-manager-ref="transactionManager"/>


</beans>
合并不起作用。。。毫无例外。。。 所有其他CRUD操作都运行良好。。 my root-context.xml:

<tx:annotation-driven transaction-manager="transactionManager"/>

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="persistenceUnitName" value="appPu"/>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
    </property>
    <property name="packagesToScan" value="com.myProject.myMvcProject"/>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.dialect">
                org.hibernate.dialect.H2Dialect
            </prop>
            <prop key="hibernate.max_fetch_depth">3</prop>
            <prop key="hibernate.jdbc.fetch_size">50</prop>
            <prop key="hibernate.jdbc.batch_size">10</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>

<tx:annotation-driven/>
<context:annotation-config/>

<context:component-scan base-package="com.myProject.myMvcProject"/>

<jpa:repositories base-package="com.myProject.myMvcProject"
                  entity-manager-factory-ref="emf"
                  transaction-manager-ref="transactionManager"/>


</beans>

org.hibernate.dial.h2方言
3.
50
10
真的

仅添加
@Transactional
是行不通的。您还需要告诉容器您想要使用注释驱动的注释。当使用java config add
@EnableTransactionManagement
进行xml add
时,第二个方法中的em是什么?@M.Deinum没有它,第一个方法也不会工作不?Spring数据JPA存储库也会做一些其他事情,所以不一定。@M.Deinum在我的根上下文中。xml。。但我认为你已经接近真相了,这肯定是交易中的一个错误。。