Java 更新em.MERGE JPA后的回滚
大家好。当我试图合并我的实体时,我遇到了一个问题。 我通过put请求从rest服务解析具有新字段“Name”的对象实体。 我试图将带有新“名称”字段的实体合并到我的数据库中,但我在更新操作后得到了回滚,也许你们知道为什么?? 这是我的控制器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
@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连接信息:
<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"/>