Java 更新em.MERGE JPA后的回滚

Java 更新em.MERGE JPA后的回滚,java,spring,hibernate,jpa,transactions,Java,Spring,Hibernate,Jpa,Transactions,大家好。当我试图合并我的实体时,我遇到了一个问题。 我通过put请求从rest服务解析具有新字段“Name”的对象实体。 我试图将带有新“名称”字段的实体合并到我的数据库中,但我在更新操作后得到了回滚,也许你们知道为什么?? 这是我的控制器 @RequestMapping(value = "/updDep", method = RequestMethod.PUT) @ResponseBody public String updDeps(@RequestBody Depar

大家好。当我试图合并我的实体时,我遇到了一个问题。 我通过put请求从rest服务解析具有新字段“Name”的对象实体。 我试图将带有新“名称”字段的实体合并到我的数据库中,但我在更新操作后得到了回滚,也许你们知道为什么?? 这是我的控制器

@RequestMapping(value = "/updDep", method = RequestMethod.PUT)
      @ResponseBody
      public String updDeps(@RequestBody Department department ) {
        departmentService.addDepartment(department);
        System.out.println("after merge;  in controller");
        return "Success";
    }
和带有addDepartment()方法的Department服务类:

项目结构:

PERSISTENCE.XML

 <persistence-unit name="MyPersistenceUnit" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/testbd"/>
            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
            <property name="hibernate.connection.username" value="root"/>
            <property name="hibernate.connection.password" value="root"/>
            <!--<property name="hibernate.hbm2ddl.import_files" value= "import.sql"/>-->
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
        </properties>
    </persistence-unit>

</persistence>
工人实体

@Entity
@Table(name = "workers")
public class Worker {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String fio;

    @ManyToOne(cascade =  {CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.EAGER)
    private Department department;

    @Column(nullable = false)
    private Integer salary;
......
@Entity
@Table(name ="departments")
public class Department implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String name;

    @OneToMany(cascade =  {CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.EAGER, mappedBy = "department")
    private Set<Worker> worker;
.......
部门实体

@Entity
@Table(name = "workers")
public class Worker {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String fio;

    @ManyToOne(cascade =  {CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.EAGER)
    private Department department;

    @Column(nullable = false)
    private Integer salary;
......
@Entity
@Table(name ="departments")
public class Department implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String name;

    @OneToMany(cascade =  {CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.EAGER, mappedBy = "department")
    private Set<Worker> worker;
.......
2) 编辑Dispatcher-servlet.xml: 现在看起来是这样的:

<mvc:annotation-driven />
    <context:component-scan base-package="epam.rest" />

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/WEB-INF/pages/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location">
            <value>classpath:jdbc.properties</value>
        </property>
    </bean>

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />

    </bean>


    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">

        <property name="dataSource" ref="dataSource" />
        <property name="packagesToScan" value="epam.rest.entity" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
        </property>
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.hbm2ddl.auto">create-drop</prop>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>

            </props>
        </property>
    </bean>


    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />

    </bean>

    <bean id="persistenceExceptionTranslationPostProcessor"
    class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
</beans>
现在怎么了?! 更新2 我查看了pom.xml文件:

....
   <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.1.8.Final</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.1.8.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.0-api</artifactId>
            <version>1.0.1.Final</version>
        </dependency>
.....
。。。。
org.hibernate
冬眠核心
4.1.8.最终版本
org.hibernate
休眠实体管理器
4.1.8.最终版本
org.hibernate.javax.persistence
hibernate-jpa-2.0-api
1.0.1.最终版本
.....
因此,当我删除ths时:

 <dependency>
                <groupId>org.hibernate.javax.persistence</groupId>
                <artifactId>hibernate-jpa-2.0-api</artifactId>
                <version>1.0.1.Final</version>
            </dependency>

org.hibernate.javax.persistence
hibernate-jpa-2.0-api
1.0.1.最终版本

一切都好

问题在于,您为Hibernate提供了两种不同的jdbc连接信息:

  • 通过Spring配置的数据源CW
  • 通过HibernateJDBC连接属性
  • 因为您需要将Spring事务划分集成到Hibernate事务逻辑中,所以您只能依赖提供给JPA TransactionManager的数据源

    这就是为什么您也会看到自动提交重新启用日志的原因

    因此,删除所有hibernate.connection.*行,您应该可以:

    <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/testbd"/>
    <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
    <property name="hibernate.connection.username" value="root"/>
    <property name="hibernate.connection.password" value="root"/>
    
    
    

    删除这些行后,Hibernate将不会用自己的内部JDBC连接提供程序覆盖数据源。

    Thx,但删除这些行后,Hibernate将停止在project deploy上创建表,并从import.sql导入数据。也许我需要在我的项目中添加一些hibernate xml配置文件?hbmddl.auto属性控制这些文件,因此应该创建平板电脑。因为你使用了更新,所以它们只会在第一次使用时变得很棒。我理解你。。但在我从您的答案中删除行之后,hibernate似乎停止了persistence.xml中的阅读道具。在我重新部署项目后,我的mysql数据库被清除了。在我看来,我需要将hbmddl.auto和导入道具移动到spring配置xml中的某个位置。对不起,如果我出错了。Spring实体管理器工厂实现也可能接受这些属性。请注意我的问题中的更新1,我仍然遇到同样的问题。
    ....
       <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-core</artifactId>
                <version>4.1.8.Final</version>
            </dependency>
    
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-entitymanager</artifactId>
                <version>4.1.8.Final</version>
            </dependency>
            <dependency>
                <groupId>org.hibernate.javax.persistence</groupId>
                <artifactId>hibernate-jpa-2.0-api</artifactId>
                <version>1.0.1.Final</version>
            </dependency>
    .....
    
     <dependency>
                    <groupId>org.hibernate.javax.persistence</groupId>
                    <artifactId>hibernate-jpa-2.0-api</artifactId>
                    <version>1.0.1.Final</version>
                </dependency>
    
    <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/testbd"/>
    <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
    <property name="hibernate.connection.username" value="root"/>
    <property name="hibernate.connection.password" value="root"/>