Я не могу обновить свою таблицу сущностей (Spring Boot 2 hibernate 5) - PullRequest
0 голосов
/ 23 февраля 2019

Я использую Spring boot 2.1.2, Hibernate 5 и mysql 5.7.25.И спящий режим приходит из весны 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 голосов
/ 23 февраля 2019

Вы сделали свою программу слишком сложной.При весенней загрузке вам не нужно реализовывать класс dao самостоятельно.Все, что вам нужно сделать, это расширить ваш дао с JpaRepository.

дао:

public interface UserAccountDao extends JpaRepository<UserAccount , Integer> {
}

service:

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

}
0 голосов
/ 23 февраля 2019

Я полагаю, что при одновременном выполнении save и saveOrUpdate возникает проблема.Либо вы должны сначала закрыть / очистить сеанс с помощью session.close(), а затем начать новую транзакцию для обновления.

Подобно SQL-запросу, если он все еще обрабатывается, хотя и выполняется, но мы используем commit, чтобы гарантировать, что окончательные изменения были внесены и существуют, а затем мы переходим к другой транзакции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...