Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

Проблема с получением данных из БД и с сохранением объектов в БД Oracle

#java #spring #oracle #hibernate #jackson


Мне надо получить список объектов file из базы данных через GET запрос.
Есть два класса:

File:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.ObjectMapper;

import javax.persistence.*;
import java.io.IOException;
import java.util.Objects;

@Entity
@Table(name = "FILE_")
public class File {

    private Long id;
    private Long storageId;
    private String name;
    private String format;
    private Long size;
    private Storage storage;

    public File() {
    }

    @Id
    @SequenceGenerator(name = "F_SQ", sequenceName = "FILE_SEQ", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "F_SQ")
    @Column(name = "FILE_ID")
    public Long getId() {
        return id;
    }

    @JsonIgnore
    //@JoinColumn(name = "STORAGE_ID_F")
    public Long getStorageId() {
        return storageId;
    }

    @Column(name = "NAME_FILE")
    public String getName() {
        return name;
    }

    @Column(name = "FORMAT_FILE")
    public String getFormat() {
        return format;
    }

    @Column(name = "SIZE_FILE")
    public Long getSize() {
        return size;
    }

    @JsonIgnore
    @ManyToOne(targetEntity = Storage.class, fetch = FetchType.LAZY)
    @JoinColumn(name = "STORAGE_ID_F")
    public Storage getStorage() {
        return storage;
    }

    @JsonCreator
    public static File createFromJson(String jsonString){

        ObjectMapper objectMapper = new ObjectMapper();

        File file = null;
        try {
            file = objectMapper.readValue(jsonString, File.class);
        }catch (IOException e){
            e.printStackTrace();
        }

        return file;
    }

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

    public void setStorageId(Long storageId) {
        this.storageId = storageId;
    }

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

    public void setFormat(String format) {
        this.format = format;
    }

    public void setSize(Long size) {
        this.size = size;
    }

    public void setStorage(Storage storage) {
        this.storage = storage;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        File file = (File) o;
        return Objects.equals(storageId, file.storageId) &&
                Objects.equals(name, file.name) &&
                Objects.equals(format, file.format) &&
                Objects.equals(size, file.size) &&
                Objects.equals(storage, file.storage);
    }

    @Override
    public int hashCode() {
        return Objects.hash(storageId, name, format, size, storage);
    }

    @Override
    public String toString() {
        return "File{" +
                "id=" + id +
                " name='" + name + '\'' +
                ", format='" + format + '\'' +
                ", size=" + size +
                ", storage=" + storage.getId() +
                '}';
    }
}


Storage:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.databind.ObjectMapper;

import javax.persistence.*;
import java.io.IOException;
import java.util.List;
import java.util.Objects;

@Entity
@Table(name = "STORAGE_")
public class Storage {

    private Long id;
    private String formatsSupported;
    private String storageCountry;
    private Long storageSize;
    private List files;

    public Storage() {
    }

    @Id
    @SequenceGenerator(name = "ST_SQ", sequenceName = "STORAGE_SEQ", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ST_SQ")
    @Column(name = "STORAGE_ID")
    public Long getId() {
        return id;
    }

    @Column(name = "FORMAT_SUPPORTED")
    public String getFormatsSupported() {
        return formatsSupported;
    }

    @Column(name = "COUNTRY_STORAGE")
    public String getStorageCountry() {
        return storageCountry;
    }

    @Column(name = "SIZE_STORAGE")
    public Long getStorageSize() {
        return storageSize;
    }

    @OneToMany(mappedBy = "storage", fetch = FetchType.LAZY, targetEntity = File.class)
    public List getFiles() {
        return files;
    }

    @JsonCreator
    public static Storage createFromJson(String jsonString){

        ObjectMapper objectMapper = new ObjectMapper();

        Storage storage = null;
        try {
            storage = objectMapper.readValue(jsonString, Storage.class);
        }catch (IOException e){
            e.printStackTrace();
        }

        return storage;
    }

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

    public void setFormatsSupported(String formatsSupported) {
        this.formatsSupported = formatsSupported;
    }

    public void setStorageCountry(String storageCountry) {
        this.storageCountry = storageCountry;
    }

    public void setStorageSize(Long storageSize) {
        this.storageSize = storageSize;
    }

    public void setFiles(List files) {
        this.files = files;
    }
}


В классе Controller метод с запросом на получение списка объектов из базы данных,
использую БД Oracle:

import com.fasterxml.jackson.databind.ObjectMapper;
import dz_spring_3.dao.FileDAO;
import dz_spring_3.dao.StorageDAO;
import dz_spring_3.model.File;
import dz_spring_3.model.Storage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;

@org.springframework.stereotype.Controller
public class Controller {

    @Autowired
    Service service;

    @Autowired
    StorageDAO storageDAO;

    @Autowired
    FileDAO fileDAO;

    @RequestMapping(method = RequestMethod.POST, value = "/saveFile", produces =
"text/plain")
    @ResponseBody
    public String saveFile(HttpServletRequest req)throws IOException {

        File file = mappingFile(req);

        if (file.getId() != null)
            return "Storage with id - " + file.getId() + " can`t be saved in DB.";

        file.setStorageId(storageDAO.findById(3L).getId());

        service.saveFile(file);

        return "File with id - " + file.getId() + " saved success.";
    }

    @RequestMapping(method = RequestMethod.GET, value = "/file", produces = "text/plain")
    @ResponseBody
    public String getAllFile(){

        return service.getAllFile().toString();
    }

    private File mappingFile(HttpServletRequest req)throws IOException {

        StringBuilder stringBuilder = new StringBuilder();

        try(BufferedReader reader = req.getReader()) {
            String line;

            while ((line = reader.readLine()) != null){
                System.out.println("Line in wile (mapping) - " + line);
                stringBuilder.append(line);
            }
        }

        ObjectMapper objectMapper = new ObjectMapper();

        String input = objectMapper.writeValueAsString(stringBuilder.toString());

        File file = objectMapper.convertValue(input, File.class);

        return file;
    }


Класс FileDAO: 

import dz_spring_3.model.File;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.query.NativeQuery;

import javax.persistence.TypedQuery;
import java.util.List;

public class FileDAO extends GeneralDAO {

    private static final String SQL_GET_ALL_FILES = "SELECT * FROM FILE_";
    private static final String SQL_GET_BY_ID_FILE = "SELECT * FROM FILE_ WHERE FILE_ID
= ?";

    @SuppressWarnings("unchecked")
    public List getAllFile(){
        List files;

        try(Session session = createSessionFactory().openSession()) {

            NativeQuery query = session.createNativeQuery(SQL_GET_ALL_FILES);
            files = query.addEntity(File.class).list();

        }catch (HibernateException e){
            System.err.println(e.getMessage());
            throw new HibernateException("Operation failed");
        }
        return files;
    }

    public File saveFile(File file) {

        Transaction tr = null;
        try(Session session = createSessionFactory().openSession()) {
            tr = session.getTransaction();
            tr.begin();

            session.save(file);

            tr.commit();
        }catch (HibernateException e){
            System.err.println("Save is failed.");
            System.err.println(e.getMessage());
            if (tr != null)
                tr.rollback();
        }

        return file;
    }

    public void updateFile(File file){

        Transaction transaction = null;
        try(Session session = createSessionFactory().openSession()) {
            transaction = session.getTransaction();
            transaction.begin();

            session.update(file);

            transaction.commit();
        }
        catch (HibernateException e){

            if (transaction != null)
                transaction.rollback();

            System.err.println(e.getMessage());
            throw new HibernateException("Operation failed.");
        }
    }

    public void deleteFile(Long id){

        Transaction transaction = null;
        try(Session session = createSessionFactory().openSession()) {
            transaction = session.getTransaction();
            transaction.begin();

            session.delete(findById(id));

            transaction.commit();
        }
        catch (HibernateException e){

            if (transaction != null)
                transaction.rollback();

            System.err.println(e.getMessage());
            throw new HibernateException("Operation failed.");
        }
    }

    @SuppressWarnings("unchecked")
    public File findById(Long id){

        File file;

        try(Session session = createSessionFactory().openSession()) {

            NativeQuery query = session.createNativeQuery(SQL_GET_BY_ID_FILE);
            if (getSingleResult(query, id) == null){
                file = null;
            }
            else
                file = (File) query.addEntity(File.class).setParameter(1, id).getSingleResult();

        }catch (HibernateException e){
            System.err.println(e.getMessage());
            throw new HibernateException("Operation failed.");
        }
        return file;
    }

    private  T getSingleResult(TypedQuery query, Long id){
        query.setMaxResults(1);

        List list = query.setParameter(1, id).getResultList();

        if (list == null || list.isEmpty()){

            return null;
        }
        return list.get(0);
    }
}


После того, как запускаю сервер Tomcatи делаю запрос 
http://localhost:8080/fileпадает несколько ошибок, вот стектрэйс:

org.springframework.web.util.NestedServletException: Request processing failed; nested
exception is javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException:
could not execute query
        org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:973)
        org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
        org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
        org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    Root Cause

    javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException:
could not execute query
        org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:149)
        org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:157)
        org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1423)
        dz_spring_3.dao.FileDAO.getAllFile(FileDAO.java:24)
        dz_spring_3.Service.getAllFile(Service.java:56)
        dz_spring_3.Controller.getAllFile(Controller.java:111)
        sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        java.lang.reflect.Method.invoke(Method.java:498)
        org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:175)
        org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:446)
        org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:434)
        org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
        org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
        org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
        org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
        org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
        org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    Root Cause

    org.hibernate.exception.GenericJDBCException: could not execute query
        org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47)
        org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111)
        org.hibernate.loader.Loader.doList(Loader.java:2695)
        org.hibernate.loader.Loader.doList(Loader.java:2675)
        org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2507)
        org.hibernate.loader.Loader.list(Loader.java:2502)
        org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:335)
        org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:2161)
        org.hibernate.internal.AbstractSharedSessionContract.list(AbstractSharedSessionContract.java:1016)
        org.hibernate.query.internal.NativeQueryImpl.doList(NativeQueryImpl.java:152)
        org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1414)
        dz_spring_3.dao.FileDAO.getAllFile(FileDAO.java:24)
        dz_spring_3.Service.getAllFile(Service.java:56)
        dz_spring_3.Controller.getAllFile(Controller.java:111)
        sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        java.lang.reflect.Method.invoke(Method.java:498)
        org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:175)
        org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:446)
        org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:434)
        org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
        org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
        org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
        org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
        org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
        org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    Root Cause

    java.sql.SQLException: Недопустимое имя столбца
        oracle.jdbc.driver.OracleStatement.getColumnIndex(OracleStatement.java:3965)
        oracle.jdbc.driver.InsensitiveScrollableResultSet.findColumn(InsensitiveScrollableResultSet.java:299)
        oracle.jdbc.driver.GeneratedResultSet.getLong(GeneratedResultSet.java:1361)
        org.hibernate.type.descriptor.sql.BigIntTypeDescriptor$2.doExtract(BigIntTypeDescriptor.java:63)
        org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:47)
        org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:261)
        org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:257)
        org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:247)
        org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:333)
        org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2854)
        org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1747)
        org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1673)
        org.hibernate.loader.Loader.getRow(Loader.java:1562)
        org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:732)
        org.hibernate.loader.Loader.processResultSet(Loader.java:991)
        org.hibernate.loader.Loader.doQuery(Loader.java:949)
        org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341)
        org.hibernate.loader.Loader.doList(Loader.java:2692)
        org.hibernate.loader.Loader.doList(Loader.java:2675)
        org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2507)
        org.hibernate.loader.Loader.list(Loader.java:2502)
        org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:335)
        org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:2161)
        org.hibernate.internal.AbstractSharedSessionContract.list(AbstractSharedSessionContract.java:1016)
        org.hibernate.query.internal.NativeQueryImpl.doList(NativeQueryImpl.java:152)
        org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1414)
        dz_spring_3.dao.FileDAO.getAllFile(FileDAO.java:24)
        dz_spring_3.Service.getAllFile(Service.java:56)
        dz_spring_3.Controller.getAllFile(Controller.java:111)
        sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        java.lang.reflect.Method.invoke(Method.java:498)
        org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:175)
        org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:446)
        org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:434)
        org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
        org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
        org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
        org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
        org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
        org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    Note The full stack trace of the root cause is available in the server logs.


Я так понимаю, эта проблема идёт из-за поля storageId, когда его убираю совсем, то
данные из базы считываются. Но это поле мне надо для того, чтобы сохраняемому в базу
объекту file просетить id хранилища storage в котором находится этот файл. Ну и при
попытке сохранить file в базу через Post запрос, тоже падает ошибка:

org.springframework.web.util.NestedServletException: Request processing failed; nested
exception is javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException:
Unable to release JDBC Connection
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:973)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

Root Cause

javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException:
Unable to release JDBC Connection
org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:149)
    org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:157)
    org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1423)
    org.hibernate.query.Query.getResultList(Query.java:146)
    dz_spring_3.dao.StorageDAO.getSingleResult(StorageDAO.java:119)
    dz_spring_3.dao.StorageDAO.findById(StorageDAO.java:103)
    dz_spring_3.Controller.saveFile(Controller.java:98)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:498)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:175)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:446)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:434)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

Root Cause

org.hibernate.exception.JDBCConnectionException:
Unable to release JDBC Connection
    org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:115)
    org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
    org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111)
    org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97)
    org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.releaseConnection(LogicalConnectionManagedImpl.java:199)
    org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.afterTransaction(LogicalConnectionManagedImpl.java:162)
    org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.afterTransaction(JdbcCoordinatorImpl.java:288)
    org.hibernate.internal.SessionImpl.afterOperation(SessionImpl.java:557)
    org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:2168)
    org.hibernate.internal.AbstractSharedSessionContract.list(AbstractSharedSessionContract.java:1016)
    org.hibernate.query.internal.NativeQueryImpl.doList(NativeQueryImpl.java:152)
    org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1414)
    org.hibernate.query.Query.getResultList(Query.java:146)
    dz_spring_3.dao.StorageDAO.getSingleResult(StorageDAO.java:119)
    dz_spring_3.dao.StorageDAO.findById(StorageDAO.java:103)
    dz_spring_3.Controller.saveFile(Controller.java:98)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:498)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:175)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:446)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:434)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

Root Cause

java.sql.SQLRecoverableException: Закрытое соединение




Файл hibernate.cfg.xml:





Что-то делаю не правильно, а вот что именно не могу понять.
Прошу подсказать или объяснить, как мне получить список объектов и сохранять объекты
file в базу данных.
    


Ответы

Ответ 1



Чтобы исправить NullPointerException в методе File.toString() нужно переписать метод @Override public String toString() { return "File{" + "id=" + id + " name='" + name + '\'' + ", format='" + format + '\'' + ", size=" + size + ", storage=" + (storage != null?storage.getId():"null") + "}"; } Потом вы перепутали сериализацию с десериализацией, нужно писать что-то типа ObjectMapper objectMapper = new ObjectMapper(); String input = stringBuilder.toString(); File file = objectMapper.readValue(input, File.class); но storage у вас неверно задан, т.е. вы можете использовать String input in (mapping) - "{\t\"name\":\"File02\",\t\"format\":\"doc\",\t\"size\":\"200\",\t\"storage\":{\"id\":\"3\"}}" Потом у вас проблема с соединениями, что соединения не закрываются как следует, и с каждым запросом создается новое количество соединений. Некоторые соединения продолжают использоваться после того как они были закрыты. Для того, чтобы исправить эту ошибку нужно закрывать фактор сессий (если вы его постоянно создаете, правда непонятно зачем, но это уже ваше дело). Например можно использовать try(SessionFactory factory = createSessionFactory();Session session = factory.openSession()) {

Ответ 2



Но это поле мне надо для того, чтобы сохраняемому в базу объекту file просетить id хранилища storage в котором находится этот файл Внешний ключ для storage как самостоятельная сущность в File не нужен; в коде эта связь выражается через JoinColumn("STORAGE_ID_F"): @JsonIgnore @ManyToOne(targetEntity = Storage.class, fetch = FetchType.LAZY) @JoinColumn(name = "STORAGE_ID_F") public Storage getStorage() { return storage; } Поле в БД добавится на основе данной конфигурации. Соответственно, в PUT необходимо в File добавлять экземпляр Storage через setStorage(), а не его идентификатор через setStorageId().

Комментариев нет:

Отправить комментарий