我无法更新我的实体表(Spring Boot 2休眠5)

时间:2019-02-22 21:06:53

标签: mysql hibernate spring-boot

我正在使用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";
    }

}

2 个答案:

答案 0 :(得分:0)

我想您在同时进行savesaveOrUpdate时会导致此问题。要么,您首先应该通过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";
  }

}