我正在使用Spring Boot 2.1.2,Hibernate 5和mysql 5.7.25。休眠来自spring data-jpa。我可以将数据插入实体表。但是问题在于更新操作。当我尝试更新实体时,它不起作用。我找不到问题。有人请帮助我解决问题。
Pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.app</groupId>
<artifactId>TestApp</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>TestApp</name>
<description>A service application.</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
属性文件
# Application running port
server.port=8000
# Application running port
server.servlet.contextPath=/
# Log files
logging.level.org.springframework.web: ERROR
logging.level.org.hibernate: ERROR
#DB config
spring.datasource.url=jdbc:mysql://localhost:3306/test_app
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.show-sql=true
#DB pool config
# Maximum number of milliseconds that a client will wait for a connection from connection pool
spring.datasource.hikari.connection-timeout=20000
# Minimum number of idle connections
spring.datasource.hikari.minimum-idle=10
# Maximum pool size
spring.datasource.hikari.maximum-pool-size=100
# Maximum amount of time in milliseconds that a connection is allowed to sit idle
spring.datasource.hikari.idle-timeout=900000
# Maximum life time in milliseconds of a connection in pool after it is closed
spring.datasource.hikari.max-lifetime=10000
# auto-commit behavior of connections returned from pool
spring.datasource.hikari.auto-commit=true
# Hibernayte config
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
# toenable transaction
logging.level.org.springframework.transaction.interceptor=TRACE
实体类
package com.app.model;
import java.io.Serializable;
import java.util.Calendar;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "tbl_user_account")
public class UserAccount implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
@Column(name = "username", nullable = false)
String username;
@Column(name = "password", nullable = false)
private String password;
@Column(name = "active", nullable = false)
private Integer active;
@Column(name = "created_date", nullable = false)
private Calendar createdDate;
@Column(name = "created_by")
private Integer createdBy;
@Column(name = "updated_date")
private Calendar updatedDate;
@Column(name = "updated_by")
private Integer updatedBy;
public Integer getCreatedBy() {
return createdBy;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public void setCreatedBy(Integer createdBy) {
this.createdBy = createdBy;
}
public Integer getUpdatedBy() {
return updatedBy;
}
public void setUpdatedBy(Integer updatedBy) {
this.updatedBy = updatedBy;
}
public UserAccount() {
super();
// TODO Auto-generated constructor stub
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getActive() {
return active;
}
public void setActive(Integer active) {
this.active = active;
}
public Calendar getCreatedDate() {
return createdDate;
}
public void setCreatedDate(Calendar createdDate) {
this.createdDate = createdDate;
}
public Calendar getUpdatedDate() {
return updatedDate;
}
public void setUpdatedDate(Calendar updatedDate) {
this.updatedDate = updatedDate;
}
}
DAO界面
package com.app.dao;
public interface UserAccountDao {
void saveAndUpdate();
}
DAOImpl
package com.app.daoImpl;
import java.util.Calendar;
import java.util.List;
import javax.persistence.EntityManagerFactory;
import javax.transaction.Transactional;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;
import com.app.dao.UserAccountDao;
import com.app.model.UserAccount;
@Repository("UserAccountDao")
@Scope("prototype")
public class UserAccountDaoImpl implements UserAccountDao {
/**
*
*/
private static final long serialVersionUID = 1L;
@Autowired
private EntityManagerFactory entityManagerFactory;
public Session getSession() {
return entityManagerFactory.unwrap(SessionFactory.class).openSession();
}
@Override
@Transactional
public void saveAndUpdate() {
Session session = getSession();
UserAccount userAccount =new UserAccount("Test@1235", "Test@1234", 1, Calendar.getInstance(), 1);
session.save(userAccount);
userAccount.setPassword("new password");
session.saveOrUpdate(userAccount);
}
}
服务界面
package com.app.service;
public interface UserAccountService {
void saveAndUpdateUserData();
}
服务等级
package com.app.serviceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import com.app.dao.UserAccountDao;
import com.app.service.UserAccountService;
@Service("UserAccountService")
@Scope("prototype")
public class UserAccountServiceImpl implements UserAccountService {
@Autowired
private UserAccountDao userAccountDao;
@Override
public void saveAndUpdateUserData() {
userAccountDao.saveAndUpdate();
}
}
控制器类
package com.app.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.app.service.UserAccountService;
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
UserAccountService userAccountService;
@GetMapping()
public String addUser() {
userAccountService.saveAndUpdateUserData();
return "Success";
}
}
答案 0 :(得分:0)
我想您在同时进行save
和saveOrUpdate
时会导致此问题。要么,您首先应该通过session.close()
关闭/刷新会话,然后开始新的事务以进行更新。
类似于sql查询,尽管它虽然仍在执行,但仍在处理,但我们使用commit来确保已经进行了最后的更改并存在,然后移至另一个事务。
答案 1 :(得分:0)
您使程序过于复杂。使用Spring Boot,您不需要自己实现dao类。
您需要做的就是从JpaRepository
扩展dao。
dao:
public interface UserAccountDao extends JpaRepository<UserAccount , Integer> {
}
服务:
@service
public UserAccountService{
@Autowired private UserAccountDao dao;
public UserAcount saveAndUpdateUserData(UserAccount newAccount) {
return dao.saveAndFlush(newAccount);
}
}
控制器:
@controller
public class TestController {
@Autowired
private UserAccountService userAccountService;
@PostMapping("/test")
public String addUser(UserAccount newAccount) {
userAccountService.saveAndUpdateUserData(newAccount);
return "Success";
}
}