代码之家  ›  专栏  ›  技术社区  ›  Vishnu Viswambharan

我无法更新实体表(Spring Boot 2 Hibernate 5)

  •  0
  • Vishnu Viswambharan  · 技术社区  · 5 年前

    我使用的是spring boot 2.1.2、hibernate 5和mysql 5.7.25。hibernate来自spring数据jpa。我可以将数据插入到实体表中。但问题在于更新操作。当我试图更新实体时,它不起作用。我找不到问题所在。有人请帮我解决这个问题。

    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();
    
    }
    

    道厄皮尔

     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";
        }
    
    }
    
    1 回复  |  直到 5 年前
        1
  •  0
  •   Himanshu    5 年前

    我想和你一样 save saveOrUpdate 同时导致问题的。或者,您应该首先通过 session.close() 然后开始新的更新事务。

    类似于sql查询,如果它仍然在处理(尽管已执行),我们使用commit as来确保最后的更改已经完成并存在,然后我们转移到另一个事务。

        2
  •  0
  •   LunaticJape    5 年前

    你的程序太复杂了。使用SpringBoot,您不需要自己实现DAO类。 你只要把刀从 JpaRepository .

    刀:

    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";
      }
    
    }