ОШИБКА - nested exception is org.hibernate.LazyInitializationException

 
 
 
Сообщения:45
При попытке найти в базе данных идентификациний код, выдает настпунту ошибку

Request processing failed; nested exception is org.hibernate.LazyInitializationException: could not initialize proxy [bank.database.persistence.model.Depositor#23] - no Session

Контроллер
package bank.database.controller;

import bank.database.persistence.model.Depositor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import bank.database.service.ServiceBankDatabase;

import javax.servlet.http.HttpServletRequest;
import java.util.List;



@Controller
public class ControllerBankDatabase {
    public static final String ROOT_PATH = "/BankDatabase";
    private static final String ROOT_PATH_1= "/newDepositor";
    private static final String ROOT_PATH_2 = "/addDepositor";
    private static final String ROOT_PATH_3 = "/showAllDepositors";
    private static final String ROOT_PATH_4 = "/findById";
    private static final String ROOT_PATH_5 = "/findClientById";
    private static final String ROOT_PATH_6 = "/findBySername";
    private static final String ROOT_PATH_7 = "/findClientBySername";
    private static final String ROOT_PATH_8 = "/findByIdenCode";
    private static final String ROOT_PATH_9 = "/findClientByIdenCode";
    private static final String ROOT_PATH_10 = "/removeById";
    private static final String ROOT_PATH_11 = "/removeClientById";

    private final ServiceBankDatabase serviceBankDatabase;

    @Autowired
    public ControllerBankDatabase(ServiceBankDatabase serviceBankDatabase) {
        this.serviceBankDatabase = serviceBankDatabase;
    }


    @RequestMapping(value = "/")
    public String homeBankDatabase() {
        return "home";
    }

    //@RequestMapping(value = ROOT_PATH_1, method = RequestMethod.GET)
    @GetMapping(value = ROOT_PATH_1)
    public ModelAndView newDepositor() {
        return new ModelAndView("depositor", "client", new Depositor());
    }

    //@RequestMapping(value = "/addDepositor", method = RequestMethod.POST)
    @PostMapping(value = ROOT_PATH_2)
    public String addDepositor(@ModelAttribute("client") Depositor depositor) {
        serviceBankDatabase.addClientOfBank(depositor);
        return "home";
    }

    @RequestMapping(value = ROOT_PATH_3)
    public String showAllDepositor(Model model) {
        List<Depositor> list = serviceBankDatabase.showAllClientOfBank();
        model.addAttribute("list", list);
        return "allClients";
    }

    @RequestMapping(value = ROOT_PATH_4)
    public String findById() {
        return "findById/findById";
    }

    @RequestMapping(value = ROOT_PATH_5)
    public String findClientById(Model model, HttpServletRequest request) {
        String id = request.getParameter("clientId");
        Integer id1 = Integer.valueOf(id);
        Depositor depositor = null;
        depositor = serviceBankDatabase.findByIdClientOfBank(id1);
        if (depositor == null) return "findById/findByIdNull";
        else {
            model.addAttribute("depositorOfTheBank", depositor);
            return "findById/findByIdAnswer";
        }
    }

    @RequestMapping(value = ROOT_PATH_6 )
    public String findBySername() {
        return "findBySername/findBySername";
    }

    @RequestMapping(value = ROOT_PATH_7)
    public String findClientBySername(Model model, HttpServletRequest request) {
        String sername = null;
        sername = (String)request.getParameter("clientSername");
        Depositor depositor = null;
        depositor = serviceBankDatabase.findBySernameClientOfBank(sername);
        if (depositor == null) return "findBySername/findBySernameNull";
        else {
            model.addAttribute("depositorOfTheBank", depositor);
            return "findBySername/findBySernameAnswer";
        }
    }

    @RequestMapping(value = ROOT_PATH_8)
    public String findByIdenCode() {
        return "findByIdenCode/idenCode";
    }

    @RequestMapping(value = ROOT_PATH_9)
    public String findClientByIdenCode(Model model, HttpServletRequest request) {
        String idenCode = request.getParameter("clientIdenCode");
        Integer idenCode1 = Integer.valueOf(idenCode);
        //Depositor depositor = null;
        //depositor = serviceBankDatabase.findByIdentificationCode(idenCode1);
        if (serviceBankDatabase.findByIdentificationCode(idenCode1) == null) return "findByIdenCode/idenCodeNull";
        else {
            model.addAttribute("depositorOfTheBank", serviceBankDatabase.findByIdentificationCode(idenCode1));
            return "findByIdenCode/idenCodeAnswer";
        }
    }

    @RequestMapping(value = ROOT_PATH_10)
    public String removeById() {
        return "remove/removeId";
    }

    @RequestMapping(value = ROOT_PATH_11)
    public String removeDepositorById(Model model, HttpServletRequest request) {
        String id = request.getParameter("removeDepositorId");
        Integer id1 = Integer.valueOf(id);
        Depositor depositor = serviceBankDatabase.findByIdClientOfBank(id1);
        if (depositor == null) return "remove/removeNull";
        else {
            serviceBankDatabase.removeClientOfBank(depositor);
            return "remove/removeAnswer";
        }
    }


}


Сервис
package bank.database.service;

import bank.database.persistence.model.Depositor;
import bank.database.persistence.repository.DaoBankDatabase;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class ServiceBankDatabaseImpl implements ServiceBankDatabase {
    @Autowired
    private DaoBankDatabase daoBankDatabase;

    @Override
    @Transactional
    public void addClientOfBank(Depositor depositor) {
        daoBankDatabase.addClientOfBank(depositor);
    }

    @Override
    @Transactional
    public void removeClientOfBank(Depositor depositor) {
        daoBankDatabase.removeClientOfBank(depositor);
    }

    @Override
    @Transactional
    public List<Depositor> showAllClientOfBank() {
        return daoBankDatabase.showAllClientOfBank();
    }


    @Override
    @Transactional
    public Depositor findByIdClientOfBank(Integer id) {
        return daoBankDatabase.findByIdClientOfBank(id);
    }

    @Override
    @Transactional
    public Depositor findBySernameClientOfBank(String sername) {
        return daoBankDatabase.findBySernameClientOfBank(sername);
    }

    @Override
    @Transactional
    public Depositor findByIdentificationCode(Integer identificationCode) {
        return daoBankDatabase.findByIdentificationCode(identificationCode);
    }
}


Дао
package bank.database.persistence.repository;

import bank.database.persistence.model.Depositor;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Repository
public class DaoBankDatabaseImpl implements DaoBankDatabase {
    @Autowired
    private SessionFactory sessionFactory;

    @Override
    public void addClientOfBank(Depositor depositor) {
        sessionFactory.getCurrentSession().saveOrUpdate(depositor);
    }

    @Override
    public void removeClientOfBank(Depositor depositor) {
        sessionFactory.getCurrentSession().delete(depositor);
    }

    @Override
    public List<Depositor> showAllClientOfBank() {
        return sessionFactory.getCurrentSession().createQuery("from Depositor").list();

    }

    @Override
    public Depositor findByIdClientOfBank(Integer id) {
        Depositor depositor = sessionFactory.getCurrentSession().get(Depositor.class, id);
        return depositor;
    }

    @Override
    public Depositor findBySernameClientOfBank(String sername) {
        Depositor depositor1 = sessionFactory.getCurrentSession().load(Depositor.class,sername);
        return depositor1;
    }

    @Override
    public Depositor findByIdentificationCode(Integer identificationCode) {
        //Depositor depositor = sessionFactory.getCurrentSession().get(Depositor.class, identificationCode);
        Depositor depositor1 = sessionFactory.getCurrentSession().load(Depositor.class,identificationCode);
        return depositor1;
    }
}


Модель
package bank.database.persistence.model;

import org.hibernate.annotations.Proxy;

import javax.persistence.*;

@Entity
@Table
public class Depositor {

    @Column
    @Id
    private Integer id;
    @Column
    private String name;
    @Column
    private String sername;
    @Column
    private int amountOfDeposit;
    @Column
    private int depositePercent;
    @Column
    private Integer identificationCode;

    public Depositor() {
    }

    public Depositor(Integer id, String name, String sername, int amountOfDeposit, int depositePercent, Integer identificationCode) {
        this.id = id;
        this.name = name;
        this.sername = sername;
        this.amountOfDeposit = amountOfDeposit;
        this.depositePercent = depositePercent;
        this.identificationCode = identificationCode;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSername() {
        return sername;
    }

    public void setSername(String sername) {
        this.sername = sername;
    }

    public int getAmountOfDeposit() {
        return amountOfDeposit;
    }

    public void setAmountOfDeposit(int amountOfDeposit) {
        this.amountOfDeposit = amountOfDeposit;
    }

    public int getDepositePercent() {
        return depositePercent;
    }

    public void setDepositePercent(int depositePercent) {
        this.depositePercent = depositePercent;
    }

    public Integer getIdentificationCode() {
        return identificationCode;
    }

    public void setIdentificationCode(Integer identificationCode) {
        this.identificationCode = identificationCode;
    }
}


Полный тест программы
https://github.com/VoloshchukTaras/BankDatabase

Подскажите, пожалуйста, в чем причина этой ошибки?
Ну и ошибку выбрасывает при попытке найти вкладчика по фамилией, но там пишет, что тот тип.
 
 
Сообщения:256
Удалось решить проблему?
 
 
Сообщения:45
Нет пока
 
 
Сообщения:256
1. Советую в корне приложения разместить файл .gitignore с содержанием, указанным ниже.
Это нужно для того, чтобы Git игнорировал файлы, шаблоны которых мы указали в этом файле.
.idea
*.iml
target/


2. Папку webapp вообще удалить. Если используете SpringBoot, то web.xml и dispatcher-servlet.xml не используем, т.к. SpringBoot содержит уже готовую базовую конфигурацию.

3. Пришлось 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.2.5.RELEASE</version>
    </parent>

    <groupId>org.voloshchuk</groupId>
    <artifactId>BankDatabase</artifactId>
    <version>1.0-SNAPSHOT</version>

    <name>BankDatabase Maven Webapp</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <java.version>1.8</java.version>
        <spring-boot.version>2.2.5.RELEASE</spring-boot.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>${spring-boot.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mustache</artifactId>
            <version>${spring-boot.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>${spring-boot.version}</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <version>${spring-boot.version}</version>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.2.8</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.mockito/mockito-core -->
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>3.3.3</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>


4. Для application.properties уже есть готовые ключи, которые можно посмотреть здесь. При возможности используйте их, иначе SpringBoot не сможет сам создать бины, такие как DataSource, SessionFactory и другие бины.
Ниже уже отредактированный application.properties.
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:1991/BankDatabase
spring.datasource.username=postgres
spring.datasource.password=Vtaras1991scorpionV

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL10Dialect
spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.show_sql=true
 
 
Сообщения:256
Приложение мне не удалось до конца запустить успешно, из-за отсутствии у меня БД. Но думаю, что должно уже всё работать.
 
 
Сообщения:45
Относительно spring boot, я знаю, что не нужно web.xml и dispatcher-servlet.xml.
Но так как у меня Intellije IDEA Community, она не поддерживает spring boot, поэтому я так делаю.

У меня так все работает, добавляет в БД, удаляет, показывает список вкладчиков, ищет по ID.

Только ошибка является которую я описал выше.
 
 
Сообщения:45
Интересно то, что когда я ищу вкладчика по Id, то все работает (у меня это поле обозначено как @Id.

Аналогично пытаюсь искать по identificationCode, уже не работает.

Если поле identificationCode обозначаю, как Id то начинает работать. Но тогда уже поиск по Id не будет работать.
 
 
Сообщения:256
Попробуйте вместо getCurrentSession() использовать openSession()
 
 
Сообщения:256
Хотя нет, я думаю неправильно вам советую. В Hibernate я не очень силён =(
 
 
Сообщения:45
Я кажется понял, все что я пробовал, это неправильно. Оно ищет по полю, отмечено ид и все. Я передаю параметр для поиска и программа ищет по ид. Я нигде не указываю по чему искать.
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет