From 12fda938868fc562178cef26ea9065bd093c881a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9?= Date: Sun, 29 Jun 2025 19:40:27 +0300 Subject: [PATCH 01/25] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=B3=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D0=B2=D0=B8=D1=82=D1=8C=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=20=D0=B8=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D1=82=D1=8C=20?= =?UTF-8?q?=D0=B1=D0=B0=D0=B7=D1=83=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20Item=20=D0=B8=20User?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 12 ++++++++++++ src/main/resources/application.properties | 9 +++++---- src/main/resources/schema.sql | 22 ++++++++++++++++++++++ 3 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/schema.sql diff --git a/pom.xml b/pom.xml index 2db888c..86331c5 100644 --- a/pom.xml +++ b/pom.xml @@ -60,6 +60,18 @@ org.springframework.boot spring-boot-starter-validation + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.postgresql + postgresql + + + com.h2database + h2 + diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index b9e5d4b..ad37e60 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -8,7 +8,8 @@ logging.level.org.springframework.transaction.interceptor=TRACE logging.level.org.springframework.orm.jpa.JpaTransactionManager=DEBUG # TODO Append connection to DB -#spring.datasource.driverClassName -#spring.datasource.url -#spring.datasource.username -#spring.datasource.password +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.url=jdbc:h2:file:./db/shareIt +spring.datasource.username=db +spring.datasource.password=12345 + diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql new file mode 100644 index 0000000..f65090a --- /dev/null +++ b/src/main/resources/schema.sql @@ -0,0 +1,22 @@ +DROP TABLE IF EXISTS users CASCADE; +DROP TABLE IF EXISTS items CASCADE; + +CREATE TABLE IF NOT EXISTS users ( + id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + name VARCHAR(255) NOT NULL, + email VARCHAR(512) NOT NULL, + CONSTRAINT pk_user PRIMARY KEY (id), + CONSTRAINT UQ_USER_EMAIL UNIQUE (email) +); + +CREATE TABLE IF NOT EXISTS items ( + id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + name VARCHAR(255) NOT NULL, + description VARCHAR(2000), + available BOOLEAN DEFAULT TRUE, + owner_id BIGINT, + request_id BIGINT, + CONSTRAINT pk_item PRIMARY KEY (id), + CONSTRAINT fk_item_owner FOREIGN KEY (owner_id) REFERENCES users(id) + --CONSTRAINT fk_item_request FOREIGN KEY (request_id) REFERENCES item_requests(id) +); \ No newline at end of file From 2e8d13c5b0bb6eedc17ad4a82c26093fa1018693 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9?= Date: Mon, 30 Jun 2025 16:46:34 +0300 Subject: [PATCH 02/25] =?UTF-8?q?=D0=9D=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B9=D0=BA=D0=B0=20JPA=20=D0=B4=D0=BB=D1=8F=20User=20=D0=B8?= =?UTF-8?q?=20Item?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/shareIt.mv.db | Bin 0 -> 40960 bytes db/shareIt.trace.db | 1952 +++++++++++++++++ .../shareit/item/dao/ItemStorage.java | 17 - .../shareit/item/dao/ItemStorageImpl.java | 68 - .../shareit/item/dto/mapper/ItemMapper.java | 8 +- .../ru/practicum/shareit/item/model/Item.java | 11 +- .../item/repository/ItemRepository.java | 18 + .../shareit/item/service/ItemServiceImpl.java | 61 +- .../shareit/user/dao/UserStorage.java | 18 - .../shareit/user/dao/UserStorageImpl.java | 63 - .../ru/practicum/shareit/user/model/User.java | 7 + .../user/repository/UserRepository.java | 10 + .../shareit/user/service/UserServiceImpl.java | 50 +- 13 files changed, 2063 insertions(+), 220 deletions(-) create mode 100644 db/shareIt.mv.db create mode 100644 db/shareIt.trace.db delete mode 100644 src/main/java/ru/practicum/shareit/item/dao/ItemStorage.java delete mode 100644 src/main/java/ru/practicum/shareit/item/dao/ItemStorageImpl.java create mode 100644 src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java delete mode 100644 src/main/java/ru/practicum/shareit/user/dao/UserStorage.java delete mode 100644 src/main/java/ru/practicum/shareit/user/dao/UserStorageImpl.java create mode 100644 src/main/java/ru/practicum/shareit/user/repository/UserRepository.java diff --git a/db/shareIt.mv.db b/db/shareIt.mv.db new file mode 100644 index 0000000000000000000000000000000000000000..20008fe182ecb5327bad9532f07e5374f161d7fb GIT binary patch literal 40960 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 literal 0 HcmV?d00001 diff --git a/db/shareIt.trace.db b/db/shareIt.trace.db new file mode 100644 index 0000000..a693f22 --- /dev/null +++ b/db/shareIt.trace.db @@ -0,0 +1,1952 @@ +2025-06-30 13:36:38.022957+03:00 jdbc[3]: exception +org.h2.jdbc.JdbcSQLSyntaxErrorException: Столбец "USER_ID" не найден +Column "USER_ID" not found; SQL statement: +insert into items (available,description,name,user_id,id) values (?,?,?,?,default) [42122-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.table.Table.getColumn(Table.java:759) + at org.h2.command.Parser.parseColumn(Parser.java:1190) + at org.h2.command.Parser.parseColumnList(Parser.java:1175) + at org.h2.command.Parser.parseInsert(Parser.java:1549) + at org.h2.command.Parser.parsePrepared(Parser.java:719) + at org.h2.command.Parser.parse(Parser.java:592) + at org.h2.command.Parser.parse(Parser.java:564) + at org.h2.command.Parser.prepareCommand(Parser.java:483) + at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:639) + at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:559) + at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1166) + at org.h2.jdbc.JdbcPreparedStatement.(JdbcPreparedStatement.java:93) + at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:1149) + at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:363) + at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl$3.doPrepare(MutationStatementPreparerImpl.java:78) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl$StatementPreparationTemplate.prepareStatement(MutationStatementPreparerImpl.java:106) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl.prepareStatement(MutationStatementPreparerImpl.java:80) + at org.hibernate.id.insert.GetGeneratedKeysDelegate.prepareStatement(GetGeneratedKeysDelegate.java:96) + at org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.delegateStatementPreparation(ModelMutationHelper.java:131) + at org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.lambda$standardPreparation$0(ModelMutationHelper.java:121) + at org.hibernate.engine.jdbc.mutation.internal.PreparedStatementDetailsStandard.resolveStatement(PreparedStatementDetailsStandard.java:87) + at org.hibernate.id.insert.GetGeneratedKeysDelegate.performMutation(GetGeneratedKeysDelegate.java:113) + at org.hibernate.engine.jdbc.mutation.internal.MutationExecutorSingleNonBatched.performNonBatchedOperations(MutationExecutorSingleNonBatched.java:47) + at org.hibernate.engine.jdbc.mutation.internal.AbstractMutationExecutor.execute(AbstractMutationExecutor.java:55) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.doStaticInserts(InsertCoordinatorStandard.java:194) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.coordinateInsert(InsertCoordinatorStandard.java:132) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.insert(InsertCoordinatorStandard.java:95) + at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:85) + at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:670) + at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:291) + at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:272) + at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:322) + at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:391) + at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:305) + at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:224) + at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:137) + at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:175) + at org.hibernate.event.internal.DefaultPersistEventListener.persist(DefaultPersistEventListener.java:93) + at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:77) + at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:54) + at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127) + at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:757) + at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:741) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:364) + at jdk.proxy2/jdk.proxy2.$Proxy137.persist(Unknown Source) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:319) + at jdk.proxy2/jdk.proxy2.$Proxy137.persist(Unknown Source) + at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:629) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:277) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:170) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:158) + at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:516) + at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285) + at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:628) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:168) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:143) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:70) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:379) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:138) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:165) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223) + at jdk.proxy2/jdk.proxy2.$Proxy142.save(Unknown Source) + at ru.practicum.shareit.item.service.ItemServiceImpl.createItem(ItemServiceImpl.java:33) + at ru.practicum.shareit.item.controller.ItemController.createItem(ItemController.java:22) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:113) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:904) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) + at java.base/java.lang.Thread.run(Thread.java:1583) +2025-06-30 13:36:38.559169+03:00 jdbc[3]: exception +org.h2.jdbc.JdbcSQLSyntaxErrorException: Столбец "USER_ID" не найден +Column "USER_ID" not found; SQL statement: +insert into items (available,description,name,user_id,id) values (?,?,?,?,default) [42122-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.table.Table.getColumn(Table.java:759) + at org.h2.command.Parser.parseColumn(Parser.java:1190) + at org.h2.command.Parser.parseColumnList(Parser.java:1175) + at org.h2.command.Parser.parseInsert(Parser.java:1549) + at org.h2.command.Parser.parsePrepared(Parser.java:719) + at org.h2.command.Parser.parse(Parser.java:592) + at org.h2.command.Parser.parse(Parser.java:564) + at org.h2.command.Parser.prepareCommand(Parser.java:483) + at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:639) + at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:559) + at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1166) + at org.h2.jdbc.JdbcPreparedStatement.(JdbcPreparedStatement.java:93) + at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:1149) + at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:363) + at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl$3.doPrepare(MutationStatementPreparerImpl.java:78) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl$StatementPreparationTemplate.prepareStatement(MutationStatementPreparerImpl.java:106) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl.prepareStatement(MutationStatementPreparerImpl.java:80) + at org.hibernate.id.insert.GetGeneratedKeysDelegate.prepareStatement(GetGeneratedKeysDelegate.java:96) + at org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.delegateStatementPreparation(ModelMutationHelper.java:131) + at org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.lambda$standardPreparation$0(ModelMutationHelper.java:121) + at org.hibernate.engine.jdbc.mutation.internal.PreparedStatementDetailsStandard.resolveStatement(PreparedStatementDetailsStandard.java:87) + at org.hibernate.id.insert.GetGeneratedKeysDelegate.performMutation(GetGeneratedKeysDelegate.java:113) + at org.hibernate.engine.jdbc.mutation.internal.MutationExecutorSingleNonBatched.performNonBatchedOperations(MutationExecutorSingleNonBatched.java:47) + at org.hibernate.engine.jdbc.mutation.internal.AbstractMutationExecutor.execute(AbstractMutationExecutor.java:55) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.doStaticInserts(InsertCoordinatorStandard.java:194) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.coordinateInsert(InsertCoordinatorStandard.java:132) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.insert(InsertCoordinatorStandard.java:95) + at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:85) + at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:670) + at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:291) + at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:272) + at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:322) + at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:391) + at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:305) + at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:224) + at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:137) + at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:175) + at org.hibernate.event.internal.DefaultPersistEventListener.persist(DefaultPersistEventListener.java:93) + at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:77) + at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:54) + at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127) + at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:757) + at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:741) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:364) + at jdk.proxy2/jdk.proxy2.$Proxy137.persist(Unknown Source) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:319) + at jdk.proxy2/jdk.proxy2.$Proxy137.persist(Unknown Source) + at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:629) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:277) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:170) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:158) + at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:516) + at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285) + at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:628) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:168) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:143) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:70) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:379) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:138) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:165) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223) + at jdk.proxy2/jdk.proxy2.$Proxy142.save(Unknown Source) + at ru.practicum.shareit.item.service.ItemServiceImpl.createItem(ItemServiceImpl.java:33) + at ru.practicum.shareit.item.controller.ItemController.createItem(ItemController.java:22) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:113) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:904) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) + at java.base/java.lang.Thread.run(Thread.java:1583) +2025-06-30 13:36:39.150503+03:00 jdbc[3]: exception +org.h2.jdbc.JdbcSQLSyntaxErrorException: Столбец "USER_ID" не найден +Column "USER_ID" not found; SQL statement: +insert into items (available,description,name,user_id,id) values (?,?,?,?,default) [42122-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.table.Table.getColumn(Table.java:759) + at org.h2.command.Parser.parseColumn(Parser.java:1190) + at org.h2.command.Parser.parseColumnList(Parser.java:1175) + at org.h2.command.Parser.parseInsert(Parser.java:1549) + at org.h2.command.Parser.parsePrepared(Parser.java:719) + at org.h2.command.Parser.parse(Parser.java:592) + at org.h2.command.Parser.parse(Parser.java:564) + at org.h2.command.Parser.prepareCommand(Parser.java:483) + at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:639) + at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:559) + at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1166) + at org.h2.jdbc.JdbcPreparedStatement.(JdbcPreparedStatement.java:93) + at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:1149) + at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:363) + at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl$3.doPrepare(MutationStatementPreparerImpl.java:78) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl$StatementPreparationTemplate.prepareStatement(MutationStatementPreparerImpl.java:106) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl.prepareStatement(MutationStatementPreparerImpl.java:80) + at org.hibernate.id.insert.GetGeneratedKeysDelegate.prepareStatement(GetGeneratedKeysDelegate.java:96) + at org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.delegateStatementPreparation(ModelMutationHelper.java:131) + at org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.lambda$standardPreparation$0(ModelMutationHelper.java:121) + at org.hibernate.engine.jdbc.mutation.internal.PreparedStatementDetailsStandard.resolveStatement(PreparedStatementDetailsStandard.java:87) + at org.hibernate.id.insert.GetGeneratedKeysDelegate.performMutation(GetGeneratedKeysDelegate.java:113) + at org.hibernate.engine.jdbc.mutation.internal.MutationExecutorSingleNonBatched.performNonBatchedOperations(MutationExecutorSingleNonBatched.java:47) + at org.hibernate.engine.jdbc.mutation.internal.AbstractMutationExecutor.execute(AbstractMutationExecutor.java:55) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.doStaticInserts(InsertCoordinatorStandard.java:194) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.coordinateInsert(InsertCoordinatorStandard.java:132) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.insert(InsertCoordinatorStandard.java:95) + at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:85) + at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:670) + at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:291) + at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:272) + at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:322) + at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:391) + at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:305) + at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:224) + at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:137) + at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:175) + at org.hibernate.event.internal.DefaultPersistEventListener.persist(DefaultPersistEventListener.java:93) + at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:77) + at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:54) + at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127) + at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:757) + at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:741) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:364) + at jdk.proxy2/jdk.proxy2.$Proxy137.persist(Unknown Source) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:319) + at jdk.proxy2/jdk.proxy2.$Proxy137.persist(Unknown Source) + at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:629) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:277) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:170) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:158) + at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:516) + at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285) + at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:628) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:168) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:143) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:70) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:379) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:138) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:165) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223) + at jdk.proxy2/jdk.proxy2.$Proxy142.save(Unknown Source) + at ru.practicum.shareit.item.service.ItemServiceImpl.createItem(ItemServiceImpl.java:33) + at ru.practicum.shareit.item.controller.ItemController.createItem(ItemController.java:22) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:113) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:904) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) + at java.base/java.lang.Thread.run(Thread.java:1583) +2025-06-30 13:36:39.395454+03:00 jdbc[3]: exception +org.h2.jdbc.JdbcSQLSyntaxErrorException: Столбец "USER_ID" не найден +Column "USER_ID" not found; SQL statement: +insert into items (available,description,name,user_id,id) values (?,?,?,?,default) [42122-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.table.Table.getColumn(Table.java:759) + at org.h2.command.Parser.parseColumn(Parser.java:1190) + at org.h2.command.Parser.parseColumnList(Parser.java:1175) + at org.h2.command.Parser.parseInsert(Parser.java:1549) + at org.h2.command.Parser.parsePrepared(Parser.java:719) + at org.h2.command.Parser.parse(Parser.java:592) + at org.h2.command.Parser.parse(Parser.java:564) + at org.h2.command.Parser.prepareCommand(Parser.java:483) + at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:639) + at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:559) + at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1166) + at org.h2.jdbc.JdbcPreparedStatement.(JdbcPreparedStatement.java:93) + at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:1149) + at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:363) + at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl$3.doPrepare(MutationStatementPreparerImpl.java:78) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl$StatementPreparationTemplate.prepareStatement(MutationStatementPreparerImpl.java:106) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl.prepareStatement(MutationStatementPreparerImpl.java:80) + at org.hibernate.id.insert.GetGeneratedKeysDelegate.prepareStatement(GetGeneratedKeysDelegate.java:96) + at org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.delegateStatementPreparation(ModelMutationHelper.java:131) + at org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.lambda$standardPreparation$0(ModelMutationHelper.java:121) + at org.hibernate.engine.jdbc.mutation.internal.PreparedStatementDetailsStandard.resolveStatement(PreparedStatementDetailsStandard.java:87) + at org.hibernate.id.insert.GetGeneratedKeysDelegate.performMutation(GetGeneratedKeysDelegate.java:113) + at org.hibernate.engine.jdbc.mutation.internal.MutationExecutorSingleNonBatched.performNonBatchedOperations(MutationExecutorSingleNonBatched.java:47) + at org.hibernate.engine.jdbc.mutation.internal.AbstractMutationExecutor.execute(AbstractMutationExecutor.java:55) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.doStaticInserts(InsertCoordinatorStandard.java:194) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.coordinateInsert(InsertCoordinatorStandard.java:132) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.insert(InsertCoordinatorStandard.java:95) + at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:85) + at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:670) + at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:291) + at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:272) + at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:322) + at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:391) + at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:305) + at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:224) + at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:137) + at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:175) + at org.hibernate.event.internal.DefaultPersistEventListener.persist(DefaultPersistEventListener.java:93) + at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:77) + at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:54) + at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127) + at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:757) + at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:741) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:364) + at jdk.proxy2/jdk.proxy2.$Proxy137.persist(Unknown Source) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:319) + at jdk.proxy2/jdk.proxy2.$Proxy137.persist(Unknown Source) + at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:629) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:277) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:170) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:158) + at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:516) + at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285) + at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:628) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:168) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:143) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:70) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:379) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:138) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:165) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223) + at jdk.proxy2/jdk.proxy2.$Proxy142.save(Unknown Source) + at ru.practicum.shareit.item.service.ItemServiceImpl.createItem(ItemServiceImpl.java:33) + at ru.practicum.shareit.item.controller.ItemController.createItem(ItemController.java:22) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:113) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:904) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) + at java.base/java.lang.Thread.run(Thread.java:1583) +2025-06-30 13:36:39.638929+03:00 jdbc[3]: exception +org.h2.jdbc.JdbcSQLSyntaxErrorException: Столбец "USER_ID" не найден +Column "USER_ID" not found; SQL statement: +insert into items (available,description,name,user_id,id) values (?,?,?,?,default) [42122-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.table.Table.getColumn(Table.java:759) + at org.h2.command.Parser.parseColumn(Parser.java:1190) + at org.h2.command.Parser.parseColumnList(Parser.java:1175) + at org.h2.command.Parser.parseInsert(Parser.java:1549) + at org.h2.command.Parser.parsePrepared(Parser.java:719) + at org.h2.command.Parser.parse(Parser.java:592) + at org.h2.command.Parser.parse(Parser.java:564) + at org.h2.command.Parser.prepareCommand(Parser.java:483) + at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:639) + at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:559) + at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1166) + at org.h2.jdbc.JdbcPreparedStatement.(JdbcPreparedStatement.java:93) + at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:1149) + at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:363) + at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl$3.doPrepare(MutationStatementPreparerImpl.java:78) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl$StatementPreparationTemplate.prepareStatement(MutationStatementPreparerImpl.java:106) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl.prepareStatement(MutationStatementPreparerImpl.java:80) + at org.hibernate.id.insert.GetGeneratedKeysDelegate.prepareStatement(GetGeneratedKeysDelegate.java:96) + at org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.delegateStatementPreparation(ModelMutationHelper.java:131) + at org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.lambda$standardPreparation$0(ModelMutationHelper.java:121) + at org.hibernate.engine.jdbc.mutation.internal.PreparedStatementDetailsStandard.resolveStatement(PreparedStatementDetailsStandard.java:87) + at org.hibernate.id.insert.GetGeneratedKeysDelegate.performMutation(GetGeneratedKeysDelegate.java:113) + at org.hibernate.engine.jdbc.mutation.internal.MutationExecutorSingleNonBatched.performNonBatchedOperations(MutationExecutorSingleNonBatched.java:47) + at org.hibernate.engine.jdbc.mutation.internal.AbstractMutationExecutor.execute(AbstractMutationExecutor.java:55) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.doStaticInserts(InsertCoordinatorStandard.java:194) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.coordinateInsert(InsertCoordinatorStandard.java:132) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.insert(InsertCoordinatorStandard.java:95) + at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:85) + at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:670) + at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:291) + at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:272) + at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:322) + at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:391) + at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:305) + at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:224) + at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:137) + at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:175) + at org.hibernate.event.internal.DefaultPersistEventListener.persist(DefaultPersistEventListener.java:93) + at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:77) + at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:54) + at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127) + at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:757) + at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:741) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:364) + at jdk.proxy2/jdk.proxy2.$Proxy137.persist(Unknown Source) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:319) + at jdk.proxy2/jdk.proxy2.$Proxy137.persist(Unknown Source) + at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:629) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:277) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:170) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:158) + at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:516) + at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285) + at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:628) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:168) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:143) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:70) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:379) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:138) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:165) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223) + at jdk.proxy2/jdk.proxy2.$Proxy142.save(Unknown Source) + at ru.practicum.shareit.item.service.ItemServiceImpl.createItem(ItemServiceImpl.java:33) + at ru.practicum.shareit.item.controller.ItemController.createItem(ItemController.java:22) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:113) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:904) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) + at java.base/java.lang.Thread.run(Thread.java:1583) +2025-06-30 13:36:39.895429+03:00 jdbc[3]: exception +org.h2.jdbc.JdbcSQLSyntaxErrorException: Столбец "USER_ID" не найден +Column "USER_ID" not found; SQL statement: +insert into items (available,description,name,user_id,id) values (?,?,?,?,default) [42122-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.table.Table.getColumn(Table.java:759) + at org.h2.command.Parser.parseColumn(Parser.java:1190) + at org.h2.command.Parser.parseColumnList(Parser.java:1175) + at org.h2.command.Parser.parseInsert(Parser.java:1549) + at org.h2.command.Parser.parsePrepared(Parser.java:719) + at org.h2.command.Parser.parse(Parser.java:592) + at org.h2.command.Parser.parse(Parser.java:564) + at org.h2.command.Parser.prepareCommand(Parser.java:483) + at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:639) + at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:559) + at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1166) + at org.h2.jdbc.JdbcPreparedStatement.(JdbcPreparedStatement.java:93) + at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:1149) + at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:363) + at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl$3.doPrepare(MutationStatementPreparerImpl.java:78) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl$StatementPreparationTemplate.prepareStatement(MutationStatementPreparerImpl.java:106) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl.prepareStatement(MutationStatementPreparerImpl.java:80) + at org.hibernate.id.insert.GetGeneratedKeysDelegate.prepareStatement(GetGeneratedKeysDelegate.java:96) + at org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.delegateStatementPreparation(ModelMutationHelper.java:131) + at org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.lambda$standardPreparation$0(ModelMutationHelper.java:121) + at org.hibernate.engine.jdbc.mutation.internal.PreparedStatementDetailsStandard.resolveStatement(PreparedStatementDetailsStandard.java:87) + at org.hibernate.id.insert.GetGeneratedKeysDelegate.performMutation(GetGeneratedKeysDelegate.java:113) + at org.hibernate.engine.jdbc.mutation.internal.MutationExecutorSingleNonBatched.performNonBatchedOperations(MutationExecutorSingleNonBatched.java:47) + at org.hibernate.engine.jdbc.mutation.internal.AbstractMutationExecutor.execute(AbstractMutationExecutor.java:55) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.doStaticInserts(InsertCoordinatorStandard.java:194) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.coordinateInsert(InsertCoordinatorStandard.java:132) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.insert(InsertCoordinatorStandard.java:95) + at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:85) + at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:670) + at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:291) + at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:272) + at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:322) + at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:391) + at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:305) + at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:224) + at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:137) + at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:175) + at org.hibernate.event.internal.DefaultPersistEventListener.persist(DefaultPersistEventListener.java:93) + at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:77) + at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:54) + at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127) + at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:757) + at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:741) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:364) + at jdk.proxy2/jdk.proxy2.$Proxy137.persist(Unknown Source) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:319) + at jdk.proxy2/jdk.proxy2.$Proxy137.persist(Unknown Source) + at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:629) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:277) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:170) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:158) + at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:516) + at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285) + at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:628) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:168) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:143) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:70) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:379) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:138) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:165) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223) + at jdk.proxy2/jdk.proxy2.$Proxy142.save(Unknown Source) + at ru.practicum.shareit.item.service.ItemServiceImpl.createItem(ItemServiceImpl.java:33) + at ru.practicum.shareit.item.controller.ItemController.createItem(ItemController.java:22) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:113) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:904) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) + at java.base/java.lang.Thread.run(Thread.java:1583) +2025-06-30 13:36:40.159490+03:00 jdbc[3]: exception +org.h2.jdbc.JdbcSQLSyntaxErrorException: Столбец "USER_ID" не найден +Column "USER_ID" not found; SQL statement: +insert into items (available,description,name,user_id,id) values (?,?,?,?,default) [42122-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.table.Table.getColumn(Table.java:759) + at org.h2.command.Parser.parseColumn(Parser.java:1190) + at org.h2.command.Parser.parseColumnList(Parser.java:1175) + at org.h2.command.Parser.parseInsert(Parser.java:1549) + at org.h2.command.Parser.parsePrepared(Parser.java:719) + at org.h2.command.Parser.parse(Parser.java:592) + at org.h2.command.Parser.parse(Parser.java:564) + at org.h2.command.Parser.prepareCommand(Parser.java:483) + at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:639) + at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:559) + at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1166) + at org.h2.jdbc.JdbcPreparedStatement.(JdbcPreparedStatement.java:93) + at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:1149) + at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:363) + at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl$3.doPrepare(MutationStatementPreparerImpl.java:78) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl$StatementPreparationTemplate.prepareStatement(MutationStatementPreparerImpl.java:106) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl.prepareStatement(MutationStatementPreparerImpl.java:80) + at org.hibernate.id.insert.GetGeneratedKeysDelegate.prepareStatement(GetGeneratedKeysDelegate.java:96) + at org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.delegateStatementPreparation(ModelMutationHelper.java:131) + at org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.lambda$standardPreparation$0(ModelMutationHelper.java:121) + at org.hibernate.engine.jdbc.mutation.internal.PreparedStatementDetailsStandard.resolveStatement(PreparedStatementDetailsStandard.java:87) + at org.hibernate.id.insert.GetGeneratedKeysDelegate.performMutation(GetGeneratedKeysDelegate.java:113) + at org.hibernate.engine.jdbc.mutation.internal.MutationExecutorSingleNonBatched.performNonBatchedOperations(MutationExecutorSingleNonBatched.java:47) + at org.hibernate.engine.jdbc.mutation.internal.AbstractMutationExecutor.execute(AbstractMutationExecutor.java:55) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.doStaticInserts(InsertCoordinatorStandard.java:194) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.coordinateInsert(InsertCoordinatorStandard.java:132) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.insert(InsertCoordinatorStandard.java:95) + at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:85) + at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:670) + at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:291) + at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:272) + at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:322) + at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:391) + at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:305) + at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:224) + at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:137) + at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:175) + at org.hibernate.event.internal.DefaultPersistEventListener.persist(DefaultPersistEventListener.java:93) + at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:77) + at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:54) + at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127) + at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:757) + at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:741) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:364) + at jdk.proxy2/jdk.proxy2.$Proxy137.persist(Unknown Source) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:319) + at jdk.proxy2/jdk.proxy2.$Proxy137.persist(Unknown Source) + at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:629) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:277) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:170) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:158) + at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:516) + at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285) + at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:628) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:168) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:143) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:70) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:379) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:138) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:165) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223) + at jdk.proxy2/jdk.proxy2.$Proxy142.save(Unknown Source) + at ru.practicum.shareit.item.service.ItemServiceImpl.createItem(ItemServiceImpl.java:33) + at ru.practicum.shareit.item.controller.ItemController.createItem(ItemController.java:22) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:113) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:904) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) + at java.base/java.lang.Thread.run(Thread.java:1583) +2025-06-30 13:36:40.380605+03:00 jdbc[3]: exception +org.h2.jdbc.JdbcSQLSyntaxErrorException: Столбец "USER_ID" не найден +Column "USER_ID" not found; SQL statement: +insert into items (available,description,name,user_id,id) values (?,?,?,?,default) [42122-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.table.Table.getColumn(Table.java:759) + at org.h2.command.Parser.parseColumn(Parser.java:1190) + at org.h2.command.Parser.parseColumnList(Parser.java:1175) + at org.h2.command.Parser.parseInsert(Parser.java:1549) + at org.h2.command.Parser.parsePrepared(Parser.java:719) + at org.h2.command.Parser.parse(Parser.java:592) + at org.h2.command.Parser.parse(Parser.java:564) + at org.h2.command.Parser.prepareCommand(Parser.java:483) + at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:639) + at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:559) + at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1166) + at org.h2.jdbc.JdbcPreparedStatement.(JdbcPreparedStatement.java:93) + at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:1149) + at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:363) + at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl$3.doPrepare(MutationStatementPreparerImpl.java:78) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl$StatementPreparationTemplate.prepareStatement(MutationStatementPreparerImpl.java:106) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl.prepareStatement(MutationStatementPreparerImpl.java:80) + at org.hibernate.id.insert.GetGeneratedKeysDelegate.prepareStatement(GetGeneratedKeysDelegate.java:96) + at org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.delegateStatementPreparation(ModelMutationHelper.java:131) + at org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.lambda$standardPreparation$0(ModelMutationHelper.java:121) + at org.hibernate.engine.jdbc.mutation.internal.PreparedStatementDetailsStandard.resolveStatement(PreparedStatementDetailsStandard.java:87) + at org.hibernate.id.insert.GetGeneratedKeysDelegate.performMutation(GetGeneratedKeysDelegate.java:113) + at org.hibernate.engine.jdbc.mutation.internal.MutationExecutorSingleNonBatched.performNonBatchedOperations(MutationExecutorSingleNonBatched.java:47) + at org.hibernate.engine.jdbc.mutation.internal.AbstractMutationExecutor.execute(AbstractMutationExecutor.java:55) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.doStaticInserts(InsertCoordinatorStandard.java:194) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.coordinateInsert(InsertCoordinatorStandard.java:132) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.insert(InsertCoordinatorStandard.java:95) + at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:85) + at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:670) + at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:291) + at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:272) + at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:322) + at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:391) + at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:305) + at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:224) + at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:137) + at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:175) + at org.hibernate.event.internal.DefaultPersistEventListener.persist(DefaultPersistEventListener.java:93) + at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:77) + at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:54) + at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127) + at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:757) + at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:741) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:364) + at jdk.proxy2/jdk.proxy2.$Proxy137.persist(Unknown Source) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:319) + at jdk.proxy2/jdk.proxy2.$Proxy137.persist(Unknown Source) + at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:629) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:277) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:170) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:158) + at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:516) + at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285) + at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:628) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:168) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:143) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:70) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:379) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:138) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:165) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223) + at jdk.proxy2/jdk.proxy2.$Proxy142.save(Unknown Source) + at ru.practicum.shareit.item.service.ItemServiceImpl.createItem(ItemServiceImpl.java:33) + at ru.practicum.shareit.item.controller.ItemController.createItem(ItemController.java:22) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:113) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:904) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) + at java.base/java.lang.Thread.run(Thread.java:1583) +2025-06-30 13:36:40.605605+03:00 jdbc[3]: exception +org.h2.jdbc.JdbcSQLSyntaxErrorException: Столбец "USER_ID" не найден +Column "USER_ID" not found; SQL statement: +insert into items (available,description,name,user_id,id) values (?,?,?,?,default) [42122-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.table.Table.getColumn(Table.java:759) + at org.h2.command.Parser.parseColumn(Parser.java:1190) + at org.h2.command.Parser.parseColumnList(Parser.java:1175) + at org.h2.command.Parser.parseInsert(Parser.java:1549) + at org.h2.command.Parser.parsePrepared(Parser.java:719) + at org.h2.command.Parser.parse(Parser.java:592) + at org.h2.command.Parser.parse(Parser.java:564) + at org.h2.command.Parser.prepareCommand(Parser.java:483) + at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:639) + at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:559) + at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1166) + at org.h2.jdbc.JdbcPreparedStatement.(JdbcPreparedStatement.java:93) + at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:1149) + at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:363) + at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl$3.doPrepare(MutationStatementPreparerImpl.java:78) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl$StatementPreparationTemplate.prepareStatement(MutationStatementPreparerImpl.java:106) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl.prepareStatement(MutationStatementPreparerImpl.java:80) + at org.hibernate.id.insert.GetGeneratedKeysDelegate.prepareStatement(GetGeneratedKeysDelegate.java:96) + at org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.delegateStatementPreparation(ModelMutationHelper.java:131) + at org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.lambda$standardPreparation$0(ModelMutationHelper.java:121) + at org.hibernate.engine.jdbc.mutation.internal.PreparedStatementDetailsStandard.resolveStatement(PreparedStatementDetailsStandard.java:87) + at org.hibernate.id.insert.GetGeneratedKeysDelegate.performMutation(GetGeneratedKeysDelegate.java:113) + at org.hibernate.engine.jdbc.mutation.internal.MutationExecutorSingleNonBatched.performNonBatchedOperations(MutationExecutorSingleNonBatched.java:47) + at org.hibernate.engine.jdbc.mutation.internal.AbstractMutationExecutor.execute(AbstractMutationExecutor.java:55) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.doStaticInserts(InsertCoordinatorStandard.java:194) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.coordinateInsert(InsertCoordinatorStandard.java:132) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.insert(InsertCoordinatorStandard.java:95) + at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:85) + at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:670) + at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:291) + at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:272) + at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:322) + at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:391) + at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:305) + at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:224) + at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:137) + at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:175) + at org.hibernate.event.internal.DefaultPersistEventListener.persist(DefaultPersistEventListener.java:93) + at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:77) + at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:54) + at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127) + at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:757) + at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:741) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:364) + at jdk.proxy2/jdk.proxy2.$Proxy137.persist(Unknown Source) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:319) + at jdk.proxy2/jdk.proxy2.$Proxy137.persist(Unknown Source) + at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:629) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:277) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:170) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:158) + at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:516) + at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285) + at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:628) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:168) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:143) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:70) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:379) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:138) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:165) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223) + at jdk.proxy2/jdk.proxy2.$Proxy142.save(Unknown Source) + at ru.practicum.shareit.item.service.ItemServiceImpl.createItem(ItemServiceImpl.java:33) + at ru.practicum.shareit.item.controller.ItemController.createItem(ItemController.java:22) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:113) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:904) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) + at java.base/java.lang.Thread.run(Thread.java:1583) +2025-06-30 13:36:40.851998+03:00 jdbc[3]: exception +org.h2.jdbc.JdbcSQLSyntaxErrorException: Столбец "USER_ID" не найден +Column "USER_ID" not found; SQL statement: +insert into items (available,description,name,user_id,id) values (?,?,?,?,default) [42122-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.table.Table.getColumn(Table.java:759) + at org.h2.command.Parser.parseColumn(Parser.java:1190) + at org.h2.command.Parser.parseColumnList(Parser.java:1175) + at org.h2.command.Parser.parseInsert(Parser.java:1549) + at org.h2.command.Parser.parsePrepared(Parser.java:719) + at org.h2.command.Parser.parse(Parser.java:592) + at org.h2.command.Parser.parse(Parser.java:564) + at org.h2.command.Parser.prepareCommand(Parser.java:483) + at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:639) + at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:559) + at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1166) + at org.h2.jdbc.JdbcPreparedStatement.(JdbcPreparedStatement.java:93) + at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:1149) + at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:363) + at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl$3.doPrepare(MutationStatementPreparerImpl.java:78) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl$StatementPreparationTemplate.prepareStatement(MutationStatementPreparerImpl.java:106) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl.prepareStatement(MutationStatementPreparerImpl.java:80) + at org.hibernate.id.insert.GetGeneratedKeysDelegate.prepareStatement(GetGeneratedKeysDelegate.java:96) + at org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.delegateStatementPreparation(ModelMutationHelper.java:131) + at org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.lambda$standardPreparation$0(ModelMutationHelper.java:121) + at org.hibernate.engine.jdbc.mutation.internal.PreparedStatementDetailsStandard.resolveStatement(PreparedStatementDetailsStandard.java:87) + at org.hibernate.id.insert.GetGeneratedKeysDelegate.performMutation(GetGeneratedKeysDelegate.java:113) + at org.hibernate.engine.jdbc.mutation.internal.MutationExecutorSingleNonBatched.performNonBatchedOperations(MutationExecutorSingleNonBatched.java:47) + at org.hibernate.engine.jdbc.mutation.internal.AbstractMutationExecutor.execute(AbstractMutationExecutor.java:55) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.doStaticInserts(InsertCoordinatorStandard.java:194) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.coordinateInsert(InsertCoordinatorStandard.java:132) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.insert(InsertCoordinatorStandard.java:95) + at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:85) + at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:670) + at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:291) + at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:272) + at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:322) + at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:391) + at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:305) + at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:224) + at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:137) + at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:175) + at org.hibernate.event.internal.DefaultPersistEventListener.persist(DefaultPersistEventListener.java:93) + at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:77) + at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:54) + at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127) + at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:757) + at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:741) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:364) + at jdk.proxy2/jdk.proxy2.$Proxy137.persist(Unknown Source) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:319) + at jdk.proxy2/jdk.proxy2.$Proxy137.persist(Unknown Source) + at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:629) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:277) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:170) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:158) + at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:516) + at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285) + at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:628) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:168) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:143) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:70) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:379) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:138) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:165) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223) + at jdk.proxy2/jdk.proxy2.$Proxy142.save(Unknown Source) + at ru.practicum.shareit.item.service.ItemServiceImpl.createItem(ItemServiceImpl.java:33) + at ru.practicum.shareit.item.controller.ItemController.createItem(ItemController.java:22) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:113) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:904) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) + at java.base/java.lang.Thread.run(Thread.java:1583) +2025-06-30 13:36:40.899998+03:00 jdbc[3]: exception +org.h2.jdbc.JdbcSQLSyntaxErrorException: Столбец "I1_0.USER_ID" не найден +Column "I1_0.USER_ID" not found; SQL statement: +select i1_0.id,i1_0.available,i1_0.description,i1_0.name,i1_0.user_id from items i1_0 where i1_0.user_id=? [42122-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.expression.ExpressionColumn.getColumnException(ExpressionColumn.java:244) + at org.h2.expression.ExpressionColumn.optimizeOther(ExpressionColumn.java:226) + at org.h2.expression.ExpressionColumn.optimize(ExpressionColumn.java:213) + at org.h2.command.query.Select.prepareExpressions(Select.java:1170) + at org.h2.command.query.Query.prepare(Query.java:218) + at org.h2.command.Parser.prepareCommand(Parser.java:489) + at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:639) + at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:559) + at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1166) + at org.h2.jdbc.JdbcPreparedStatement.(JdbcPreparedStatement.java:93) + at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:316) + at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:328) + at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) + at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:153) + at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:183) + at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:155) + at org.hibernate.sql.exec.spi.JdbcSelectExecutor.lambda$list$0(JdbcSelectExecutor.java:85) + at org.hibernate.sql.results.jdbc.internal.DeferredResultSetAccess.executeQuery(DeferredResultSetAccess.java:231) + at org.hibernate.sql.results.jdbc.internal.DeferredResultSetAccess.getResultSet(DeferredResultSetAccess.java:167) + at org.hibernate.sql.results.jdbc.internal.JdbcValuesResultSetImpl.advanceNext(JdbcValuesResultSetImpl.java:265) + at org.hibernate.sql.results.jdbc.internal.JdbcValuesResultSetImpl.processNext(JdbcValuesResultSetImpl.java:145) + at org.hibernate.sql.results.jdbc.internal.AbstractJdbcValues.next(AbstractJdbcValues.java:19) + at org.hibernate.sql.results.internal.RowProcessingStateStandardImpl.next(RowProcessingStateStandardImpl.java:67) + at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:204) + at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:33) + at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.doExecuteQuery(JdbcSelectExecutorStandardImpl.java:211) + at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.executeQuery(JdbcSelectExecutorStandardImpl.java:83) + at org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:76) + at org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:65) + at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.lambda$new$2(ConcreteSqmSelectQueryPlan.java:139) + at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.withCacheableSqmInterpretation(ConcreteSqmSelectQueryPlan.java:382) + at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.performList(ConcreteSqmSelectQueryPlan.java:302) + at org.hibernate.query.sqm.internal.QuerySqmImpl.doList(QuerySqmImpl.java:526) + at org.hibernate.query.spi.AbstractSelectionQuery.list(AbstractSelectionQuery.java:423) + at org.hibernate.query.Query.getResultList(Query.java:120) + at org.springframework.data.jpa.repository.query.JpaQueryExecution$CollectionExecution.doExecute(JpaQueryExecution.java:129) + at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:92) + at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:152) + at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:140) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:170) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:158) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:164) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:143) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:70) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:379) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:138) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:136) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223) + at jdk.proxy2/jdk.proxy2.$Proxy142.findAllByOwner(Unknown Source) + at ru.practicum.shareit.item.service.ItemServiceImpl.findUserItems(ItemServiceImpl.java:60) + at ru.practicum.shareit.item.controller.ItemController.findUserItems(ItemController.java:40) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:113) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:904) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) + at java.base/java.lang.Thread.run(Thread.java:1583) +2025-06-30 13:36:41.095753+03:00 jdbc[3]: exception +org.h2.jdbc.JdbcSQLSyntaxErrorException: Столбец "USER_ID" не найден +Column "USER_ID" not found; SQL statement: +insert into items (available,description,name,user_id,id) values (?,?,?,?,default) [42122-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.table.Table.getColumn(Table.java:759) + at org.h2.command.Parser.parseColumn(Parser.java:1190) + at org.h2.command.Parser.parseColumnList(Parser.java:1175) + at org.h2.command.Parser.parseInsert(Parser.java:1549) + at org.h2.command.Parser.parsePrepared(Parser.java:719) + at org.h2.command.Parser.parse(Parser.java:592) + at org.h2.command.Parser.parse(Parser.java:564) + at org.h2.command.Parser.prepareCommand(Parser.java:483) + at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:639) + at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:559) + at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1166) + at org.h2.jdbc.JdbcPreparedStatement.(JdbcPreparedStatement.java:93) + at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:1149) + at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:363) + at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl$3.doPrepare(MutationStatementPreparerImpl.java:78) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl$StatementPreparationTemplate.prepareStatement(MutationStatementPreparerImpl.java:106) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl.prepareStatement(MutationStatementPreparerImpl.java:80) + at org.hibernate.id.insert.GetGeneratedKeysDelegate.prepareStatement(GetGeneratedKeysDelegate.java:96) + at org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.delegateStatementPreparation(ModelMutationHelper.java:131) + at org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.lambda$standardPreparation$0(ModelMutationHelper.java:121) + at org.hibernate.engine.jdbc.mutation.internal.PreparedStatementDetailsStandard.resolveStatement(PreparedStatementDetailsStandard.java:87) + at org.hibernate.id.insert.GetGeneratedKeysDelegate.performMutation(GetGeneratedKeysDelegate.java:113) + at org.hibernate.engine.jdbc.mutation.internal.MutationExecutorSingleNonBatched.performNonBatchedOperations(MutationExecutorSingleNonBatched.java:47) + at org.hibernate.engine.jdbc.mutation.internal.AbstractMutationExecutor.execute(AbstractMutationExecutor.java:55) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.doStaticInserts(InsertCoordinatorStandard.java:194) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.coordinateInsert(InsertCoordinatorStandard.java:132) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.insert(InsertCoordinatorStandard.java:95) + at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:85) + at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:670) + at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:291) + at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:272) + at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:322) + at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:391) + at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:305) + at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:224) + at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:137) + at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:175) + at org.hibernate.event.internal.DefaultPersistEventListener.persist(DefaultPersistEventListener.java:93) + at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:77) + at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:54) + at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127) + at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:757) + at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:741) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:364) + at jdk.proxy2/jdk.proxy2.$Proxy137.persist(Unknown Source) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:319) + at jdk.proxy2/jdk.proxy2.$Proxy137.persist(Unknown Source) + at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:629) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:277) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:170) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:158) + at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:516) + at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285) + at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:628) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:168) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:143) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:70) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:379) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:138) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:165) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223) + at jdk.proxy2/jdk.proxy2.$Proxy142.save(Unknown Source) + at ru.practicum.shareit.item.service.ItemServiceImpl.createItem(ItemServiceImpl.java:33) + at ru.practicum.shareit.item.controller.ItemController.createItem(ItemController.java:22) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:113) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:904) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) + at java.base/java.lang.Thread.run(Thread.java:1583) +2025-06-30 13:36:41.353752+03:00 jdbc[3]: exception +org.h2.jdbc.JdbcSQLSyntaxErrorException: Столбец "USER_ID" не найден +Column "USER_ID" not found; SQL statement: +insert into items (available,description,name,user_id,id) values (?,?,?,?,default) [42122-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.table.Table.getColumn(Table.java:759) + at org.h2.command.Parser.parseColumn(Parser.java:1190) + at org.h2.command.Parser.parseColumnList(Parser.java:1175) + at org.h2.command.Parser.parseInsert(Parser.java:1549) + at org.h2.command.Parser.parsePrepared(Parser.java:719) + at org.h2.command.Parser.parse(Parser.java:592) + at org.h2.command.Parser.parse(Parser.java:564) + at org.h2.command.Parser.prepareCommand(Parser.java:483) + at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:639) + at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:559) + at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1166) + at org.h2.jdbc.JdbcPreparedStatement.(JdbcPreparedStatement.java:93) + at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:1149) + at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:363) + at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl$3.doPrepare(MutationStatementPreparerImpl.java:78) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl$StatementPreparationTemplate.prepareStatement(MutationStatementPreparerImpl.java:106) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl.prepareStatement(MutationStatementPreparerImpl.java:80) + at org.hibernate.id.insert.GetGeneratedKeysDelegate.prepareStatement(GetGeneratedKeysDelegate.java:96) + at org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.delegateStatementPreparation(ModelMutationHelper.java:131) + at org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.lambda$standardPreparation$0(ModelMutationHelper.java:121) + at org.hibernate.engine.jdbc.mutation.internal.PreparedStatementDetailsStandard.resolveStatement(PreparedStatementDetailsStandard.java:87) + at org.hibernate.id.insert.GetGeneratedKeysDelegate.performMutation(GetGeneratedKeysDelegate.java:113) + at org.hibernate.engine.jdbc.mutation.internal.MutationExecutorSingleNonBatched.performNonBatchedOperations(MutationExecutorSingleNonBatched.java:47) + at org.hibernate.engine.jdbc.mutation.internal.AbstractMutationExecutor.execute(AbstractMutationExecutor.java:55) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.doStaticInserts(InsertCoordinatorStandard.java:194) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.coordinateInsert(InsertCoordinatorStandard.java:132) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.insert(InsertCoordinatorStandard.java:95) + at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:85) + at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:670) + at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:291) + at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:272) + at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:322) + at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:391) + at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:305) + at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:224) + at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:137) + at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:175) + at org.hibernate.event.internal.DefaultPersistEventListener.persist(DefaultPersistEventListener.java:93) + at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:77) + at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:54) + at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127) + at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:757) + at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:741) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:364) + at jdk.proxy2/jdk.proxy2.$Proxy137.persist(Unknown Source) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:319) + at jdk.proxy2/jdk.proxy2.$Proxy137.persist(Unknown Source) + at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:629) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:277) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:170) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:158) + at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:516) + at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285) + at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:628) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:168) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:143) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:70) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:379) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:138) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:165) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223) + at jdk.proxy2/jdk.proxy2.$Proxy142.save(Unknown Source) + at ru.practicum.shareit.item.service.ItemServiceImpl.createItem(ItemServiceImpl.java:33) + at ru.practicum.shareit.item.controller.ItemController.createItem(ItemController.java:22) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:113) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:904) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) + at java.base/java.lang.Thread.run(Thread.java:1583) +2025-06-30 13:39:10.420011+03:00 jdbc[3]: exception +org.h2.jdbc.JdbcSQLSyntaxErrorException: Столбец "USER_ID" не найден +Column "USER_ID" not found; SQL statement: +insert into items (available,description,name,user_id,id) values (?,?,?,?,default) [42122-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.table.Table.getColumn(Table.java:759) + at org.h2.command.Parser.parseColumn(Parser.java:1190) + at org.h2.command.Parser.parseColumnList(Parser.java:1175) + at org.h2.command.Parser.parseInsert(Parser.java:1549) + at org.h2.command.Parser.parsePrepared(Parser.java:719) + at org.h2.command.Parser.parse(Parser.java:592) + at org.h2.command.Parser.parse(Parser.java:564) + at org.h2.command.Parser.prepareCommand(Parser.java:483) + at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:639) + at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:559) + at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1166) + at org.h2.jdbc.JdbcPreparedStatement.(JdbcPreparedStatement.java:93) + at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:1149) + at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:363) + at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl$3.doPrepare(MutationStatementPreparerImpl.java:78) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl$StatementPreparationTemplate.prepareStatement(MutationStatementPreparerImpl.java:106) + at org.hibernate.engine.jdbc.internal.MutationStatementPreparerImpl.prepareStatement(MutationStatementPreparerImpl.java:80) + at org.hibernate.id.insert.GetGeneratedKeysDelegate.prepareStatement(GetGeneratedKeysDelegate.java:96) + at org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.delegateStatementPreparation(ModelMutationHelper.java:131) + at org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.lambda$standardPreparation$0(ModelMutationHelper.java:121) + at org.hibernate.engine.jdbc.mutation.internal.PreparedStatementDetailsStandard.resolveStatement(PreparedStatementDetailsStandard.java:87) + at org.hibernate.id.insert.GetGeneratedKeysDelegate.performMutation(GetGeneratedKeysDelegate.java:113) + at org.hibernate.engine.jdbc.mutation.internal.MutationExecutorSingleNonBatched.performNonBatchedOperations(MutationExecutorSingleNonBatched.java:47) + at org.hibernate.engine.jdbc.mutation.internal.AbstractMutationExecutor.execute(AbstractMutationExecutor.java:55) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.doStaticInserts(InsertCoordinatorStandard.java:194) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.coordinateInsert(InsertCoordinatorStandard.java:132) + at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.insert(InsertCoordinatorStandard.java:95) + at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:85) + at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:670) + at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:291) + at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:272) + at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:322) + at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:391) + at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:305) + at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:224) + at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:137) + at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:175) + at org.hibernate.event.internal.DefaultPersistEventListener.persist(DefaultPersistEventListener.java:93) + at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:77) + at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:54) + at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127) + at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:757) + at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:741) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:364) + at jdk.proxy2/jdk.proxy2.$Proxy137.persist(Unknown Source) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:319) + at jdk.proxy2/jdk.proxy2.$Proxy137.persist(Unknown Source) + at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:629) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:277) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:170) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:158) + at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:516) + at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285) + at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:628) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:168) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:143) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:70) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:379) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:138) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:165) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223) + at jdk.proxy2/jdk.proxy2.$Proxy142.save(Unknown Source) + at ru.practicum.shareit.item.service.ItemServiceImpl.createItem(ItemServiceImpl.java:33) + at ru.practicum.shareit.item.controller.ItemController.createItem(ItemController.java:22) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:113) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:904) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) + at java.base/java.lang.Thread.run(Thread.java:1583) diff --git a/src/main/java/ru/practicum/shareit/item/dao/ItemStorage.java b/src/main/java/ru/practicum/shareit/item/dao/ItemStorage.java deleted file mode 100644 index f539e57..0000000 --- a/src/main/java/ru/practicum/shareit/item/dao/ItemStorage.java +++ /dev/null @@ -1,17 +0,0 @@ -package ru.practicum.shareit.item.dao; - -import ru.practicum.shareit.item.model.Item; - -import java.util.List; - -public interface ItemStorage { - Item createItem(Item item); - - Item updateItem(Long userId, Item updateItem); - - Item findItemById(Long itemId); - - List findUserItems(); - - List searchItem(); -} diff --git a/src/main/java/ru/practicum/shareit/item/dao/ItemStorageImpl.java b/src/main/java/ru/practicum/shareit/item/dao/ItemStorageImpl.java deleted file mode 100644 index 3eef63e..0000000 --- a/src/main/java/ru/practicum/shareit/item/dao/ItemStorageImpl.java +++ /dev/null @@ -1,68 +0,0 @@ -package ru.practicum.shareit.item.dao; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; -import ru.practicum.shareit.exception.NotFoundException; -import ru.practicum.shareit.item.model.Item; - -import java.util.*; - -@Slf4j -@Repository -public class ItemStorageImpl implements ItemStorage { - - private final Map items = new HashMap<>(); - - @Override - public Item createItem(Item item) { - item.setId(getId()); - items.put(item.getId(), item); - return item; - } - - @Override - public Item updateItem(Long userId, Item updateItem) { - if (!items.containsKey(updateItem.getId())) { - log.warn("Обновляемая вещь не найдена"); - throw new NotFoundException("Обновляемая вещь не найдена"); - } else { - Item oldItem = items.get(updateItem.getId()); - - if (updateItem.getName() == null) { - updateItem.setName(oldItem.getName()); - } - if (updateItem.getDescription() == null) { - updateItem.setDescription(oldItem.getDescription()); - } - if (updateItem.getAvailable() == null) { - updateItem.setAvailable(oldItem.getAvailable()); - } - } - - items.put(updateItem.getId(), updateItem); - return updateItem; - } - - @Override - public Item findItemById(Long itemId) { - return items.get(itemId); - } - - @Override - public List findUserItems() { - return new ArrayList<>(items.values()); - } - - @Override - public List searchItem() { - return new ArrayList<>(items.values()); - } - - private Long getId() { - long lastId = items.keySet().stream() - .mapToLong(Long::longValue) - .max() - .orElse(0); - return lastId + 1; - } -} diff --git a/src/main/java/ru/practicum/shareit/item/dto/mapper/ItemMapper.java b/src/main/java/ru/practicum/shareit/item/dto/mapper/ItemMapper.java index 5a3137c..cb9aacb 100644 --- a/src/main/java/ru/practicum/shareit/item/dto/mapper/ItemMapper.java +++ b/src/main/java/ru/practicum/shareit/item/dto/mapper/ItemMapper.java @@ -22,8 +22,8 @@ public static Item toItem(User user, ItemDto itemDto) { itemDto.getName(), itemDto.getDescription(), itemDto.getAvailable(), - user, - null + user + //null ); } @@ -33,8 +33,8 @@ public static Item toItem(Long id, User user, ItemDto itemDto) { itemDto.getName(), itemDto.getDescription(), itemDto.getAvailable(), - user, - null + user + //null ); } } diff --git a/src/main/java/ru/practicum/shareit/item/model/Item.java b/src/main/java/ru/practicum/shareit/item/model/Item.java index 9499466..67b2b97 100644 --- a/src/main/java/ru/practicum/shareit/item/model/Item.java +++ b/src/main/java/ru/practicum/shareit/item/model/Item.java @@ -1,17 +1,26 @@ package ru.practicum.shareit.item.model; +import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; import ru.practicum.shareit.request.ItemRequest; import ru.practicum.shareit.user.model.User; +@NoArgsConstructor @AllArgsConstructor @Data +@Entity +@Table(name = "items") public class Item { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String description; private Boolean available; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "owner_id") private User owner; - private ItemRequest request; + //private ItemRequest request; } diff --git a/src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java b/src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java new file mode 100644 index 0000000..1a910af --- /dev/null +++ b/src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java @@ -0,0 +1,18 @@ +package ru.practicum.shareit.item.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import ru.practicum.shareit.item.model.Item; +import ru.practicum.shareit.user.model.User; + +import java.util.List; + +public interface ItemRepository extends JpaRepository { + List findAllByOwner(User user); + + @Query("select i from Item i " + + "where upper(i.name) like upper(concat('%', ?1, '%')) " + + " or upper(i.description) like upper(concat('%', ?1, '%'))") + List search(String text); +} diff --git a/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java b/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java index 2e4c3f3..d933101 100644 --- a/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java +++ b/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java @@ -5,12 +5,12 @@ import org.springframework.stereotype.Service; import ru.practicum.shareit.exception.NotFoundException; import ru.practicum.shareit.exception.ValidationException; -import ru.practicum.shareit.item.dao.ItemStorage; +import ru.practicum.shareit.item.repository.ItemRepository; import ru.practicum.shareit.item.dto.ItemDto; import ru.practicum.shareit.item.dto.mapper.ItemMapper; import ru.practicum.shareit.item.model.Item; import ru.practicum.shareit.user.model.User; -import ru.practicum.shareit.user.dao.UserStorage; +import ru.practicum.shareit.user.repository.UserRepository; import java.util.ArrayList; import java.util.List; @@ -22,41 +22,52 @@ @Service public class ItemServiceImpl implements ItemService { - private final ItemStorage itemStorage; - private final UserStorage userStorage; + private final ItemRepository itemRepository; + private final UserRepository userRepository; @Override public ItemDto createItem(Long userId, ItemDto itemDto) { - User user = userStorage.findUserById(userId); - validateUser(user, userId); + User user = validateUser(userId); - return ItemMapper.toItemDto(itemStorage.createItem( + return ItemMapper.toItemDto(itemRepository.save( ItemMapper.toItem(user, itemDto)) ); } @Override public ItemDto updateItem(Long itemId, Long userId, ItemDto itemDto) { - User user = userStorage.findUserById(userId); - validateUser(user, userId); + validateUser(userId); - if (!Objects.equals(userId, itemStorage.findItemById(itemId).getOwner().getId())) { + Item item = validateItem(itemId); + + if (!Objects.equals(userId, item.getOwner().getId())) { log.warn("Внесение изменений доступно владельцу"); throw new ValidationException("Внесение изменений доступно владельцу"); } - Item item = ItemMapper.toItem(itemId, user, itemDto); - return ItemMapper.toItemDto(itemStorage.updateItem(userId, item)); + if (itemDto.getName() != null && !itemDto.getName().isBlank()) { + item.setName(itemDto.getName()); + } + if (itemDto.getDescription() != null && !itemDto.getDescription().isBlank()) { + item.setDescription(itemDto.getDescription()); + } + if (itemDto.getAvailable() != null) { + item.setAvailable(itemDto.getAvailable()); + } + + return ItemMapper.toItemDto(itemRepository.save(item)); } @Override public ItemDto findItemById(Long itemId) { - return ItemMapper.toItemDto(itemStorage.findItemById(itemId)); + Item item = validateItem(itemId); + return ItemMapper.toItemDto(item); } @Override public List findUserItems(Long userId) { - return itemStorage.findUserItems().stream() + User user = validateUser(userId); + return itemRepository.findAllByOwner(user).stream() .filter(item -> Objects.equals(item.getOwner().getId(), userId)) .map(ItemMapper::toItemDto) .collect(Collectors.toList()); @@ -68,21 +79,19 @@ public List searchItem(String text) { return new ArrayList<>(); } - return itemStorage.searchItem().stream() - .filter(Objects::nonNull) - .filter(item -> - (item.getName() != null && item.getName().toLowerCase().contains(text.toLowerCase())) || - (item.getDescription() != null && item.getDescription().toLowerCase().contains(text.toLowerCase())) - ) - .filter(item -> item.getAvailable() != null && item.getAvailable()) + return itemRepository.search(text).stream() + .filter(item -> Objects.equals(item.getAvailable(), Boolean.TRUE)) .map(ItemMapper::toItemDto) .collect(Collectors.toList()); } - private void validateUser(User user, Long userId) { - if (user == null) { - log.warn("Пользователь с данным id {} не найден", userId); - throw new NotFoundException("Пользователь с данным id: " + userId + " не найден"); - } + private User validateUser(Long userId) { + return userRepository.findById(userId) + .orElseThrow(() -> new NotFoundException("Пользователь с данным id: " + userId + " не найден")); + } + + private Item validateItem(Long itemId) { + return itemRepository.findById(itemId) + .orElseThrow(() -> new NotFoundException("Элемент с данным id: " + itemId + " не найден")); } } diff --git a/src/main/java/ru/practicum/shareit/user/dao/UserStorage.java b/src/main/java/ru/practicum/shareit/user/dao/UserStorage.java deleted file mode 100644 index 9c43da2..0000000 --- a/src/main/java/ru/practicum/shareit/user/dao/UserStorage.java +++ /dev/null @@ -1,18 +0,0 @@ -package ru.practicum.shareit.user.dao; - -import ru.practicum.shareit.user.model.User; - -import java.util.List; - -public interface UserStorage { - - List findAllUsers(); - - User findUserById(Long id); - - User createUser(User user); - - User updateUser(User updateUser); - - void deleteUser(Long id); -} diff --git a/src/main/java/ru/practicum/shareit/user/dao/UserStorageImpl.java b/src/main/java/ru/practicum/shareit/user/dao/UserStorageImpl.java deleted file mode 100644 index 8c764f6..0000000 --- a/src/main/java/ru/practicum/shareit/user/dao/UserStorageImpl.java +++ /dev/null @@ -1,63 +0,0 @@ -package ru.practicum.shareit.user.dao; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; -import ru.practicum.shareit.exception.NotFoundException; -import ru.practicum.shareit.user.model.User; - -import java.util.*; - -@Slf4j -@Repository -public class UserStorageImpl implements UserStorage { - private Map users = new HashMap<>(); - - @Override - public List findAllUsers() { - return new ArrayList<>(users.values()); - } - - @Override - public User findUserById(Long id) { - return users.get(id); - } - - @Override - public User createUser(User user) { - user.setId(getId()); - users.put(user.getId(), user); - return user; - } - - @Override - public User updateUser(User updateUser) { - if (!users.containsKey(updateUser.getId())) { - log.warn("Обновляемый пользователь не найден"); - throw new NotFoundException("Обновляемый пользователь не найден"); - } else { - User oldUser = users.get(updateUser.getId()); - if (updateUser.getName() == null) { - updateUser.setName(oldUser.getName()); - } - if (updateUser.getEmail() == null) { - updateUser.setEmail(oldUser.getEmail()); - } - } - - users.put(updateUser.getId(), updateUser); - return updateUser; - } - - @Override - public void deleteUser(Long id) { - users.remove(id); - } - - private Long getId() { - long lastId = users.keySet().stream() - .mapToLong(Long::longValue) - .max() - .orElse(0); - return lastId + 1; - } -} diff --git a/src/main/java/ru/practicum/shareit/user/model/User.java b/src/main/java/ru/practicum/shareit/user/model/User.java index cdf04eb..959fdd7 100644 --- a/src/main/java/ru/practicum/shareit/user/model/User.java +++ b/src/main/java/ru/practicum/shareit/user/model/User.java @@ -1,11 +1,18 @@ package ru.practicum.shareit.user.model; +import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; +@NoArgsConstructor @AllArgsConstructor @Data +@Entity +@Table(name = "users") public class User { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String email; diff --git a/src/main/java/ru/practicum/shareit/user/repository/UserRepository.java b/src/main/java/ru/practicum/shareit/user/repository/UserRepository.java new file mode 100644 index 0000000..c79d1e1 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/user/repository/UserRepository.java @@ -0,0 +1,10 @@ +package ru.practicum.shareit.user.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import ru.practicum.shareit.user.model.User; + +import java.util.Optional; + +public interface UserRepository extends JpaRepository { + Optional findByEmail(String email); +} diff --git a/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java b/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java index 905c72c..e5d966b 100644 --- a/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java +++ b/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java @@ -8,10 +8,9 @@ import ru.practicum.shareit.user.dto.UserDto; import ru.practicum.shareit.user.dto.mapper.UserMapper; import ru.practicum.shareit.user.model.User; -import ru.practicum.shareit.user.dao.UserStorage; +import ru.practicum.shareit.user.repository.UserRepository; import java.util.List; -import java.util.Objects; import java.util.stream.Collectors; @Slf4j @@ -19,23 +18,19 @@ @Service public class UserServiceImpl implements UserService { - private final UserStorage userStorage; + private final UserRepository userRepository; @Override public List findAllUsers() { - return userStorage.findAllUsers().stream() + return userRepository.findAll().stream() .map(UserMapper::toUserDto) .collect(Collectors.toList()); } @Override public UserDto findUserById(Long id) { - User user = userStorage.findUserById(id); + User user = validateUser(id); - if (user == null) { - log.warn("Пользователь с данным id {} не найден", id); - throw new NotFoundException("Пользователь с данным id: " + id + " не найден"); - } return UserMapper.toUserDto(user); } @@ -43,34 +38,43 @@ public UserDto findUserById(Long id) { public UserDto createUser(UserDto userDto) { validateEmail(null, userDto); - return UserMapper.toUserDto(userStorage.createUser(UserMapper.toUser(userDto))); + return UserMapper.toUserDto(userRepository.save(UserMapper.toUser(userDto))); } @Override public UserDto updateUser(Long id, UserDto updateUserDto) { - User existingUser = userStorage.findUserById(id); + User existingUser = validateUser(id); + + validateEmail(id, updateUserDto); - if (existingUser == null) { - log.warn("Пользователь с id: {} не найден", id); - throw new NotFoundException("Пользователь с данным id " + id + " не найден."); + if (updateUserDto.getName() != null && !updateUserDto.getName().isBlank()) { + existingUser.setName(updateUserDto.getName()); } - validateEmail(id, updateUserDto); + if (updateUserDto.getEmail() != null && !updateUserDto.getEmail().isBlank()) { + existingUser.setEmail(updateUserDto.getEmail()); + } - return UserMapper.toUserDto(userStorage.updateUser(UserMapper.toUser(id, updateUserDto))); + return UserMapper.toUserDto(userRepository.save(existingUser)); } @Override public void deleteUser(Long id) { - userStorage.deleteUser(id); + userRepository.deleteById(id); } private void validateEmail(Long id, UserDto userDto) { - if (userStorage.findAllUsers().stream() - .anyMatch(viewedUser -> Objects.equals(viewedUser.getEmail(), userDto.getEmail()) - && !Objects.equals(viewedUser.getId(), id))) { - log.warn("Данная электронная почта {} уже существует", userDto.getEmail()); - throw new InternalServerException("Данная электронная почта уже существует"); - } + userRepository.findByEmail(userDto.getEmail()) + .ifPresent(user -> { + if (!user.getId().equals(id)) { + log.warn("Данная электронная почта уже существует"); + throw new InternalServerException("Данная электронная почта уже существует"); + } + }); + } + + private User validateUser(Long userId) { + return userRepository.findById(userId) + .orElseThrow(() -> new NotFoundException("Пользователь с данным id: " + userId + " не найден")); } } From 0769d653c167a45595662ea6bdf575f5da781bea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9?= Date: Mon, 30 Jun 2025 20:10:47 +0300 Subject: [PATCH 03/25] =?UTF-8?q?=D0=A1=D0=BE=D0=B7=D0=B4=D0=B0=D1=82?= =?UTF-8?q?=D1=8C=20=D0=B1=D0=B0=D0=B7=D1=83=20=D0=B4=D0=B0=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D1=85=20=D0=B4=D0=BB=D1=8F=20=D1=81=D1=83=D1=89=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/shareIt.mv.db | Bin 40960 -> 57344 bytes db/shareIt.trace.db | 203 ++++++++++++++++++ .../ru/practicum/shareit/booking/Booking.java | 23 +- src/main/resources/schema.sql | 48 ++++- 4 files changed, 261 insertions(+), 13 deletions(-) diff --git a/db/shareIt.mv.db b/db/shareIt.mv.db index 20008fe182ecb5327bad9532f07e5374f161d7fb..67bef77616c0fb8637676949a74d1f9f4fcd3c6e 100644 GIT binary patch literal 57344 zcmeHQ%WoS=dZ%R3?vX8fJho?McV{*|8jokZt5LeE-vSmeA5Do89}-DDky)a;yIN|A zB4s{g(LsPklKlgcW3Y!L$RURWSR}dRHb@XGkW(;+067JVAeSHr@;W9!zHWAtO^T!` zTe7{`5jXE6wZvc_abBrKegdc&zfG&hA^Ax-mu)R#;_=2b%`vl047 z5ugZA1SkR&0g3=cfFeKqg$k)INed@<_Zo0BD8Aq(|dt+^yhmI!MD zI9ru0w9s^p$&w_Cwjo;K*ZT|=PU{nyC!^i*W#t0$3& zw&h)??9O%iAAj=UM_)3MW=UAKEk-p|Of1cgL}vct!NaNP4(==XX1k;uz0&zt64Oyzfh?;3?2EvSJ zaw6hon-OhUv^3LTBm@wuoXtoAvM{7%B$X2k!RDc=SjL>fe_E^WFCL)9kS>T1Q`iKA+n)_Y2EYroX93hf ztm`)dOQztD2mfuu=L(czCfZSkLDgx3S}n%gO%kiuaXV0H$)LI_#;`+OvTnrMwWSk6wP8}tP(_c0ymZ_YZm-u3B1j7 z5ZO`;4%`?c+Xjaq0o)Kyw80H2ydZ0YcW)$FvBAM9h&OBnTZ|$h0X!_vDBu+}&X#W| zCboGZF$(xO*|H#tZQCjVH>=7ZAg>t=ctTZ_WZrek8a!8!cVk4t4c7<$Bv$%~STCCr#2uV7Ika03}zqQsb3B%FYF z#zHo)n5w~8s%G%EKyFx=(~!h5P@;(}OJWE@$S`CCH-cjG*kFie5=(Hu!3N(Ny-&?|$%O{QiPVTKW=;j{SUVZ2f^3dAOLQZ>m# z*PXom%JcS1_~j(9XGs%N#5?a3Ubzbh(?cKMjLbx*I&W^S|G|#;=7!n*$=nCGBa!Pr zpSv54&PArCugyfS-(cREy?JXc@(KHBr>K|ML_v?0^m2SNok_9?iSz9I+;2~HzGXLy zdVx)+*j&EE>O1LTsmRVJ*>pU(CAiz~{p2N4?0ij~}w1&i#guLm*uUgO`)LSc(-&>~^}e!t!iE4+W9P#`R1-w_Gfj@?{V4 z&)84qbYFt?LOKhTV%PNDkP!a2W%#xXI+V|ae)Aj2ZJ)=F*w5x_pgjQ1@V11uPqK-8 zu2?F>+?MRM_4-=b&1s$uN$`c2DVxqE^__6kj*PxEpM&(3K%;YMXn59bu_BuUjZWth zrE}>wH@u?CUJI4I+(*{RZ^cfIsdS-Odi(`c^4DLkl6@u5vzwl{U(9z3c|4(@kHK<& z_5#aEgRWnd<)nm^s7j((RykcPi%Nnkt0DwrTtZ4Ec`lAppd+qRc}dGj>cvDMyzYYGP9C9FmaI=rUcQNamtnMLm z8?ZiJIA?v|2mMV=ZhdIL{QQ>oEM);S^JKVYcA||nKR3#S%@56g3G(my@()^SYOU<% zTJ{^jwc~S^7F3|uNMU1(MCShb2Y+`x`a$IOop=2_C7FVbN#QgOAXeyI=(?6I(Gr+xHCZHMXZGGw*>;w}z{9H|khh_G4YtoMZDd z_n;zQjW%aL(P7AOMcsQfnMw&dxHj-|dRY_{xg1MLdRY@xJ|5Ra zLDZFV{_O%C4`2NJh;GHqhZl1}lZiXt1%2y6E{Gp+LB00qxS(&3c0t{!V_lFR>!L1* zpP%^-RAhg&mH8Q${j1vqo{EmCQ7G!5t$hUb{HqbR<|l(E&B$R3IHPm&447MA;X^I% zTn@b&O>T4_gVFuY3py2vd^QV1LaRiNw8v*37` zUI;qh{=>Ya@05l;%ER6Kz^Mll00UXXHcKlbE%Cb-v&6~jFy0cOXF8XjyfXlp^z{aM zt<*6^7F6_fcyFK^b+m@Uz}k;>QB#b?=Vv~Fs*LFlB=UJzp~iIwx+218erR`K9;!F0 zJJ3x$x_)4RVJQZTFDP=T-G$Tjp4LN6ZfJMlQvhd7cOb|%^}ZInpeVV9jo z1vhHdQt_xwWVQFZT*}rPi|lHv;t+O~)Ge}?bMRuaR;_}h?OsHsvRl>si2=j<7 z))zOkwZ;LFlqdT^^`cC!&@xDs-6E~yAEuknNu?Yo_38nxTTo~(-fS^hUu5HT5WUT& zh*Q~yqRFvCgplabn;Yx6S$Ckccx@k7ce12jajL2s1|WJXAFBZ7F~fkm@5U;`gd*_) zuJ%Na&gE7?R5l4&Ia>wXsz_X49=F%G51eL|wAmG0C8b=AR8R<`=$%rkP5|U}_+LA9 zOm=H0)3$KA*u?dtP_^F8Z#xyERcBMco4A{T>K&EWYUJc3B+K1mv0XVOjV7tHS$N4) zFK2Pv0IbPkqE>(ARQn`*Z#`d!a&g^hK-+Jvf(nqjB!%+3S6U&C<**s2*{l$D{UG^O zq5|qtZ7!}jl@n5Lh9ckJahn5Mq}e2FtbW{R)?xk6ZlYE(+U50D-D-zw^PpI&Roeh< z^{7>~oa%l#4m&`OD(&iGhO`>y!4U~%{r+awX*Aeks{x7>2Yn}yBf-#Oq`cg!?AM+( zj+{{Z4~iKu5~!4GF0GRj^1~vr+{P}i;5t-SK|N6-k?Fgi{EYbzu)JHtoA|*v+3t-- zC?@jHgw~>C0`%m1#X`+ zj`zp4^4t(>n;GV&J{Z&b(Q{4x$j?MG-y+TVd)=Nys#kbI3ju zTJgqVZ8fv?Y-4>}UA2?X4tL_my0fMcdUvHLT z(c41qR7~!dTH2nrGl#ZLRN1kg8%H@qQkM_Rw0^X*hSNtYho-1+wO0kT(y&DHNY1Vy zXRBE|bDl)+h`F8Y-lFR0=Qhq!L8H(ITf z9wU<7s|NLF=pal#^(a9DjIXm)6x}%vjS_V$pl>RH+q8S!Jzy%GIGswsM*E zcBZknU#y!axad3;HCG{09^Q`2TGTdWt?bAn=S?AoWt`Qr2RQ4tr= z32Km(;pTBOceXFKS5NS6BRz-e*%U9A@??idduyBP!r4>Nfl&PLVA+X3J!>`c%JXNt z)x*}Q+DdM33#+HG==;%IxxLNJ{ndorkPhZhe1FGD7&hWDzjK`4T&rX%mUwC(KP%QY zcO0#HSa_;E&o8f8`&E5qrM^<Fj^I1{9s0j^4f&y)zSiHyXWrJ^J2_ z=shNS|DEWA+316t(f4n8(WC#l@P{|2z8ARxy8#z@h4Zhxe--?z=wBuOD*IQ(zpDOK z^RL*y8vfPvuaNf04&w$-otW@2j2I!6H+ZfH=qGq#()^P(Mj6G z20ZP#PJx{OFNH(MFTV2|(!$Ava6r4`71JcgC$MM)M7ZsR;c;Ed)bF?|DQU+_N!)0nCQ~K-My_CTw zr6o_=pdm*lg+<%$j-kFnJ4pj*Me_)xkVZBRz~pWT>r48HrxIQD zK9|;3`(vOXF+4Z1RQ3#XY0y9)g)D>{Vh;YU+t0jc9jiYdE7)T2xRY7eIM2rnHt%-x z1JB{b3br(OwGXz^b%gUB&*;pi&^2BW;UmLGfsY0s13o5v_$h5lo>HfTDG5UEM}-fD z4+kG%%8hTqhd`hEvoDu#MP?(j-VX6aAaxgdx8Ubtanzz?U3YhdFY-+10{cDuo9;J4 z@Qv7siaHnRr&HaX=Ymf_j|O(2SDaI_?(If*H=+Bx(cLez5IDCl-86^pOE(r;)m8&2 z>w|6TonWllwM;-OymwvbZdzZcnP%$*SIzd4ZS(e@^duI2i4{*`-rqCNFAPd70E_-e zfh|{F4tAhxeH-b`iwZ1y0>kFYkh~l}#m@zM^$Dj*ayMj{SQ5J-6RQ^LhAagA#9qj@ z#NKZps48`TlQl3;=tle~68Zj*J6G6??}pvI`0f?<;zuG=Pa@ZU4|X}ZS6K1oUSY*o zB=T#K$j!ek!SzYx)*pWZ*RLaUU*3;IzJeF!{~L$&Pa?P9ar22p?)>;0QLw$n^+oqX zzUY3)7d;4dME66!=zi$6itbf`{-X#`1SkR&0g3=cfFeKW3B;emW z?VX}0^-j?PG7Vm}4DNDx^m@5;rgYpR`{aSS40p!Goxgwy_&)kSb?B@G2~VNO9r`~K zOic8Od&N88|C|2%d$3*X=7?#j-V7DIfuJ)~M@w(<4Amd?=F=p9K204t18AO~0Th9H z?3{LvBBvZO>nDX(RvI?z2MhhU*EEj?j_~`xJISVN8t2tHuO`9pLVK7eV+x}Df0Y04 ztsrN;0^O$kf56NziC=l!;#^1{QrZ8bzQm{(eeLV zIsSjaFk=!2dFiS`GaNtmqmA-<$g!y&Qaz++D7+DG^F|8&CA4?S|Nllbjq?A$;H=#wNu7e~xZEc`z2->6d!DF6Tb z;0Y9yao`V7bYA4-j0@24QvUxiG3EbP{{L?%|G&!w8?fJA#_>0kao!IYvG-JY5xGC* z{|}vD6FLYYe1^^#PI#AZp7Q^{fO6ZVria5ZJlf#_Hrug;zu|N*L-h(b`Tzgy zg8cu#Px=4hOaaROe~wf=I5~jw|HJVLl>a|;mIUShU+NvsF`BafZRP*h`}zN+9=jTx z>vDPQY61J#tMUI^~IztuW|5q-J|KFRO zvQ^3IJ5zJ$B$^UdS!F!`znAS*&ZB`&Q~v+O7i>zMWUKIH#ktT1*vTlWDE}Yj|EK)_ zzo0yMm*rR9wtOz+=Oz*U(leaQxl;Z=%KuOK|0)0frMsUi&agZF560hpIeV; literal 40960 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 diff --git a/db/shareIt.trace.db b/db/shareIt.trace.db index a693f22..92e6807 100644 --- a/db/shareIt.trace.db +++ b/db/shareIt.trace.db @@ -1950,3 +1950,206 @@ insert into items (available,description,name,user_id,id) values (?,?,?,?,defaul at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) at java.base/java.lang.Thread.run(Thread.java:1583) +2025-06-30 20:02:05.011452+03:00 jdbc[3]: exception +org.h2.jdbc.JdbcSQLSyntaxErrorException: Синтаксическая ошибка в выражении SQL "create TABLE IF NOT EXISTS comments ( id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, text VARCHAR(2000), item_id BIGINT NOT NULL, author_id BIGINT NOT NULL CONSTRAINT pk_comment PRIMARY KEY [*](id), CONSTRAINT fk_cooment_item FOREIGN KEY (item_id) REFERENCES items(id), CONSTRAINT fk_cooment_author FOREIGN KEY (author_id) REFERENCES users(id) )"; ожидалось "HASH, CONSTRAINT, COMMENT, UNIQUE, NOT NULL, CHECK, REFERENCES, ,, )" +Syntax error in SQL statement "create TABLE IF NOT EXISTS comments ( id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, text VARCHAR(2000), item_id BIGINT NOT NULL, author_id BIGINT NOT NULL CONSTRAINT pk_comment PRIMARY KEY [*](id), CONSTRAINT fk_cooment_item FOREIGN KEY (item_id) REFERENCES items(id), CONSTRAINT fk_cooment_author FOREIGN KEY (author_id) REFERENCES users(id) )"; expected "HASH, CONSTRAINT, COMMENT, UNIQUE, NOT NULL, CHECK, REFERENCES, ,, )"; SQL statement: +create TABLE IF NOT EXISTS comments ( id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, text VARCHAR(2000), item_id BIGINT NOT NULL, author_id BIGINT NOT NULL CONSTRAINT pk_comment PRIMARY KEY (id), CONSTRAINT fk_cooment_item FOREIGN KEY (item_id) REFERENCES items(id), CONSTRAINT fk_cooment_author FOREIGN KEY (author_id) REFERENCES users(id) ) [42001-224] +2025-06-30 20:07:57.871009+03:00 jdbc[3]: exception +java.sql.SQLClientInfoException: Client info name 'ApplicationName' not supported. + at org.h2.jdbc.JdbcConnection.setClientInfo(JdbcConnection.java:1626) + at org.jkiss.dbeaver.ext.generic.model.GenericDataSource.populateClientAppName(GenericDataSource.java:200) + at org.jkiss.dbeaver.ext.generic.model.GenericDataSource.openConnection(GenericDataSource.java:163) + at org.jkiss.dbeaver.ext.h2.model.H2DataSource.openConnection(H2DataSource.java:74) + at org.jkiss.dbeaver.model.impl.jdbc.JDBCExecutionContext.connect(JDBCExecutionContext.java:124) + at org.jkiss.dbeaver.model.impl.jdbc.JDBCRemoteInstance.initializeMainContext(JDBCRemoteInstance.java:106) + at org.jkiss.dbeaver.model.impl.jdbc.JDBCRemoteInstance.(JDBCRemoteInstance.java:61) + at org.jkiss.dbeaver.model.impl.jdbc.JDBCDataSource.initializeRemoteInstance(JDBCDataSource.java:125) + at org.jkiss.dbeaver.ext.generic.model.GenericDataSource.(GenericDataSource.java:125) + at org.jkiss.dbeaver.ext.h2.model.H2DataSource.(H2DataSource.java:43) + at org.jkiss.dbeaver.ext.h2.model.H2MetaModel.createDataSourceImpl(H2MetaModel.java:56) + at org.jkiss.dbeaver.ext.generic.GenericDataSourceProvider.openDataSource(GenericDataSourceProvider.java:57) + at org.jkiss.dbeaver.registry.DataSourceDescriptor.openDataSource(DataSourceDescriptor.java:1419) + at org.jkiss.dbeaver.registry.DataSourceDescriptor.connect0(DataSourceDescriptor.java:1271) + at org.jkiss.dbeaver.registry.DataSourceDescriptor.connect(DataSourceDescriptor.java:1061) + at org.jkiss.dbeaver.runtime.jobs.ConnectJob.run(ConnectJob.java:78) + at org.jkiss.dbeaver.runtime.jobs.ConnectJob.runSync(ConnectJob.java:109) + at org.jkiss.dbeaver.ui.actions.datasource.DataSourceHandler.connectToDataSource(DataSourceHandler.java:123) + at org.jkiss.dbeaver.ui.actions.datasource.UIServiceConnectionsImpl.initConnection(UIServiceConnectionsImpl.java:87) + at org.jkiss.dbeaver.model.DBUtils.initDataSource(DBUtils.java:2455) + at org.jkiss.dbeaver.model.navigator.DBNDataSource.initializeNode(DBNDataSource.java:159) + at org.jkiss.dbeaver.model.navigator.DBNDatabaseNode.getChildren(DBNDatabaseNode.java:226) + at org.jkiss.dbeaver.model.navigator.DBNDatabaseNode.getChildren(DBNDatabaseNode.java:1) + at org.jkiss.dbeaver.model.navigator.DBNUtils.getNodeChildrenFiltered(DBNUtils.java:94) + at org.jkiss.dbeaver.ui.navigator.database.load.TreeLoadService.evaluate(TreeLoadService.java:49) + at org.jkiss.dbeaver.ui.navigator.database.load.TreeLoadService.evaluate(TreeLoadService.java:1) + at org.jkiss.dbeaver.ui.LoadingJob.run(LoadingJob.java:88) + at org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:119) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63) +2025-06-30 20:07:59.645296+03:00 jdbc[3]: exception +org.h2.jdbc.JdbcSQLSyntaxErrorException: Столбец "KEY_SEQ" не найден +Column "KEY_SEQ" not found [42122-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.jdbc.JdbcResultSet.getColumnIndex(JdbcResultSet.java:3492) + at org.h2.jdbc.JdbcResultSet.getInt(JdbcResultSet.java:337) + at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCResultSetImpl.getInt(JDBCResultSetImpl.java:510) + at org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils.safeGetInt(JDBCUtils.java:117) + at org.jkiss.dbeaver.ext.generic.model.GenericUtils.safeGetInt(GenericUtils.java:84) + at org.jkiss.dbeaver.ext.generic.model.meta.GenericMetaModel.createConstraintColumnsImpl(GenericMetaModel.java:949) + at org.jkiss.dbeaver.ext.h2.model.H2MetaModel.createConstraintColumnsImpl(H2MetaModel.java:179) + at org.jkiss.dbeaver.ext.generic.model.ConstraintKeysCache.fetchObjectRow(ConstraintKeysCache.java:98) + at org.jkiss.dbeaver.ext.generic.model.ConstraintKeysCache.fetchObjectRow(ConstraintKeysCache.java:1) + at org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache.loadObjects(JDBCCompositeCache.java:369) + at org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache.getObjects(JDBCCompositeCache.java:123) + at org.jkiss.dbeaver.ext.generic.model.GenericObjectContainer.cacheStructure(GenericObjectContainer.java:264) + at org.jkiss.dbeaver.erd.model.ERDUtils.lambda$0(ERDUtils.java:171) + at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:189) + at org.jkiss.dbeaver.erd.model.ERDUtils.collectDatabaseTables(ERDUtils.java:169) + at org.jkiss.dbeaver.erd.ui.editor.ERDEditorEmbedded.loadFromDatabase(ERDEditorEmbedded.java:257) + at org.jkiss.dbeaver.erd.ui.editor.ERDEditorEmbedded$1.evaluate(ERDEditorEmbedded.java:180) + at org.jkiss.dbeaver.erd.ui.editor.ERDEditorEmbedded$1.evaluate(ERDEditorEmbedded.java:1) + at org.jkiss.dbeaver.ui.LoadingJob.run(LoadingJob.java:88) + at org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:119) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63) +2025-06-30 20:07:59.647295+03:00 jdbc[3]: exception +org.h2.jdbc.JdbcSQLSyntaxErrorException: Столбец "KEY_SEQ" не найден +Column "KEY_SEQ" not found [42122-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.jdbc.JdbcResultSet.getColumnIndex(JdbcResultSet.java:3492) + at org.h2.jdbc.JdbcResultSet.getInt(JdbcResultSet.java:337) + at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCResultSetImpl.getInt(JDBCResultSetImpl.java:510) + at org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils.safeGetInt(JDBCUtils.java:117) + at org.jkiss.dbeaver.ext.generic.model.GenericUtils.safeGetInt(GenericUtils.java:84) + at org.jkiss.dbeaver.ext.generic.model.meta.GenericMetaModel.createConstraintColumnsImpl(GenericMetaModel.java:949) + at org.jkiss.dbeaver.ext.h2.model.H2MetaModel.createConstraintColumnsImpl(H2MetaModel.java:179) + at org.jkiss.dbeaver.ext.generic.model.ConstraintKeysCache.fetchObjectRow(ConstraintKeysCache.java:98) + at org.jkiss.dbeaver.ext.generic.model.ConstraintKeysCache.fetchObjectRow(ConstraintKeysCache.java:1) + at org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache.loadObjects(JDBCCompositeCache.java:369) + at org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache.getObjects(JDBCCompositeCache.java:123) + at org.jkiss.dbeaver.ext.generic.model.GenericObjectContainer.cacheStructure(GenericObjectContainer.java:264) + at org.jkiss.dbeaver.erd.model.ERDUtils.lambda$0(ERDUtils.java:171) + at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:189) + at org.jkiss.dbeaver.erd.model.ERDUtils.collectDatabaseTables(ERDUtils.java:169) + at org.jkiss.dbeaver.erd.ui.editor.ERDEditorEmbedded.loadFromDatabase(ERDEditorEmbedded.java:257) + at org.jkiss.dbeaver.erd.ui.editor.ERDEditorEmbedded$1.evaluate(ERDEditorEmbedded.java:180) + at org.jkiss.dbeaver.erd.ui.editor.ERDEditorEmbedded$1.evaluate(ERDEditorEmbedded.java:1) + at org.jkiss.dbeaver.ui.LoadingJob.run(LoadingJob.java:88) + at org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:119) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63) +2025-06-30 20:07:59.648294+03:00 jdbc[3]: exception +org.h2.jdbc.JdbcSQLSyntaxErrorException: Столбец "KEY_SEQ" не найден +Column "KEY_SEQ" not found [42122-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.jdbc.JdbcResultSet.getColumnIndex(JdbcResultSet.java:3492) + at org.h2.jdbc.JdbcResultSet.getInt(JdbcResultSet.java:337) + at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCResultSetImpl.getInt(JDBCResultSetImpl.java:510) + at org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils.safeGetInt(JDBCUtils.java:117) + at org.jkiss.dbeaver.ext.generic.model.GenericUtils.safeGetInt(GenericUtils.java:84) + at org.jkiss.dbeaver.ext.generic.model.meta.GenericMetaModel.createConstraintColumnsImpl(GenericMetaModel.java:949) + at org.jkiss.dbeaver.ext.h2.model.H2MetaModel.createConstraintColumnsImpl(H2MetaModel.java:179) + at org.jkiss.dbeaver.ext.generic.model.ConstraintKeysCache.fetchObjectRow(ConstraintKeysCache.java:98) + at org.jkiss.dbeaver.ext.generic.model.ConstraintKeysCache.fetchObjectRow(ConstraintKeysCache.java:1) + at org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache.loadObjects(JDBCCompositeCache.java:369) + at org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache.getObjects(JDBCCompositeCache.java:123) + at org.jkiss.dbeaver.ext.generic.model.GenericObjectContainer.cacheStructure(GenericObjectContainer.java:264) + at org.jkiss.dbeaver.erd.model.ERDUtils.lambda$0(ERDUtils.java:171) + at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:189) + at org.jkiss.dbeaver.erd.model.ERDUtils.collectDatabaseTables(ERDUtils.java:169) + at org.jkiss.dbeaver.erd.ui.editor.ERDEditorEmbedded.loadFromDatabase(ERDEditorEmbedded.java:257) + at org.jkiss.dbeaver.erd.ui.editor.ERDEditorEmbedded$1.evaluate(ERDEditorEmbedded.java:180) + at org.jkiss.dbeaver.erd.ui.editor.ERDEditorEmbedded$1.evaluate(ERDEditorEmbedded.java:1) + at org.jkiss.dbeaver.ui.LoadingJob.run(LoadingJob.java:88) + at org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:119) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63) +2025-06-30 20:07:59.649296+03:00 jdbc[3]: exception +org.h2.jdbc.JdbcSQLSyntaxErrorException: Столбец "KEY_SEQ" не найден +Column "KEY_SEQ" not found [42122-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.jdbc.JdbcResultSet.getColumnIndex(JdbcResultSet.java:3492) + at org.h2.jdbc.JdbcResultSet.getInt(JdbcResultSet.java:337) + at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCResultSetImpl.getInt(JDBCResultSetImpl.java:510) + at org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils.safeGetInt(JDBCUtils.java:117) + at org.jkiss.dbeaver.ext.generic.model.GenericUtils.safeGetInt(GenericUtils.java:84) + at org.jkiss.dbeaver.ext.generic.model.meta.GenericMetaModel.createConstraintColumnsImpl(GenericMetaModel.java:949) + at org.jkiss.dbeaver.ext.h2.model.H2MetaModel.createConstraintColumnsImpl(H2MetaModel.java:179) + at org.jkiss.dbeaver.ext.generic.model.ConstraintKeysCache.fetchObjectRow(ConstraintKeysCache.java:98) + at org.jkiss.dbeaver.ext.generic.model.ConstraintKeysCache.fetchObjectRow(ConstraintKeysCache.java:1) + at org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache.loadObjects(JDBCCompositeCache.java:369) + at org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache.getObjects(JDBCCompositeCache.java:123) + at org.jkiss.dbeaver.ext.generic.model.GenericObjectContainer.cacheStructure(GenericObjectContainer.java:264) + at org.jkiss.dbeaver.erd.model.ERDUtils.lambda$0(ERDUtils.java:171) + at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:189) + at org.jkiss.dbeaver.erd.model.ERDUtils.collectDatabaseTables(ERDUtils.java:169) + at org.jkiss.dbeaver.erd.ui.editor.ERDEditorEmbedded.loadFromDatabase(ERDEditorEmbedded.java:257) + at org.jkiss.dbeaver.erd.ui.editor.ERDEditorEmbedded$1.evaluate(ERDEditorEmbedded.java:180) + at org.jkiss.dbeaver.erd.ui.editor.ERDEditorEmbedded$1.evaluate(ERDEditorEmbedded.java:1) + at org.jkiss.dbeaver.ui.LoadingJob.run(LoadingJob.java:88) + at org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:119) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63) +2025-06-30 20:07:59.651295+03:00 jdbc[3]: exception +org.h2.jdbc.JdbcSQLSyntaxErrorException: Столбец "KEY_SEQ" не найден +Column "KEY_SEQ" not found [42122-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.jdbc.JdbcResultSet.getColumnIndex(JdbcResultSet.java:3492) + at org.h2.jdbc.JdbcResultSet.getInt(JdbcResultSet.java:337) + at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCResultSetImpl.getInt(JDBCResultSetImpl.java:510) + at org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils.safeGetInt(JDBCUtils.java:117) + at org.jkiss.dbeaver.ext.generic.model.GenericUtils.safeGetInt(GenericUtils.java:84) + at org.jkiss.dbeaver.ext.generic.model.meta.GenericMetaModel.createConstraintColumnsImpl(GenericMetaModel.java:949) + at org.jkiss.dbeaver.ext.h2.model.H2MetaModel.createConstraintColumnsImpl(H2MetaModel.java:179) + at org.jkiss.dbeaver.ext.generic.model.ConstraintKeysCache.fetchObjectRow(ConstraintKeysCache.java:98) + at org.jkiss.dbeaver.ext.generic.model.ConstraintKeysCache.fetchObjectRow(ConstraintKeysCache.java:1) + at org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache.loadObjects(JDBCCompositeCache.java:369) + at org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache.getObjects(JDBCCompositeCache.java:123) + at org.jkiss.dbeaver.ext.generic.model.GenericObjectContainer.cacheStructure(GenericObjectContainer.java:264) + at org.jkiss.dbeaver.erd.model.ERDUtils.lambda$0(ERDUtils.java:171) + at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:189) + at org.jkiss.dbeaver.erd.model.ERDUtils.collectDatabaseTables(ERDUtils.java:169) + at org.jkiss.dbeaver.erd.ui.editor.ERDEditorEmbedded.loadFromDatabase(ERDEditorEmbedded.java:257) + at org.jkiss.dbeaver.erd.ui.editor.ERDEditorEmbedded$1.evaluate(ERDEditorEmbedded.java:180) + at org.jkiss.dbeaver.erd.ui.editor.ERDEditorEmbedded$1.evaluate(ERDEditorEmbedded.java:1) + at org.jkiss.dbeaver.ui.LoadingJob.run(LoadingJob.java:88) + at org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:119) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63) +2025-06-30 20:07:59.652294+03:00 jdbc[3]: exception +org.h2.jdbc.JdbcSQLSyntaxErrorException: Столбец "KEY_SEQ" не найден +Column "KEY_SEQ" not found [42122-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.jdbc.JdbcResultSet.getColumnIndex(JdbcResultSet.java:3492) + at org.h2.jdbc.JdbcResultSet.getInt(JdbcResultSet.java:337) + at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCResultSetImpl.getInt(JDBCResultSetImpl.java:510) + at org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils.safeGetInt(JDBCUtils.java:117) + at org.jkiss.dbeaver.ext.generic.model.GenericUtils.safeGetInt(GenericUtils.java:84) + at org.jkiss.dbeaver.ext.generic.model.meta.GenericMetaModel.createConstraintColumnsImpl(GenericMetaModel.java:949) + at org.jkiss.dbeaver.ext.h2.model.H2MetaModel.createConstraintColumnsImpl(H2MetaModel.java:179) + at org.jkiss.dbeaver.ext.generic.model.ConstraintKeysCache.fetchObjectRow(ConstraintKeysCache.java:98) + at org.jkiss.dbeaver.ext.generic.model.ConstraintKeysCache.fetchObjectRow(ConstraintKeysCache.java:1) + at org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache.loadObjects(JDBCCompositeCache.java:369) + at org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache.getObjects(JDBCCompositeCache.java:123) + at org.jkiss.dbeaver.ext.generic.model.GenericObjectContainer.cacheStructure(GenericObjectContainer.java:264) + at org.jkiss.dbeaver.erd.model.ERDUtils.lambda$0(ERDUtils.java:171) + at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:189) + at org.jkiss.dbeaver.erd.model.ERDUtils.collectDatabaseTables(ERDUtils.java:169) + at org.jkiss.dbeaver.erd.ui.editor.ERDEditorEmbedded.loadFromDatabase(ERDEditorEmbedded.java:257) + at org.jkiss.dbeaver.erd.ui.editor.ERDEditorEmbedded$1.evaluate(ERDEditorEmbedded.java:180) + at org.jkiss.dbeaver.erd.ui.editor.ERDEditorEmbedded$1.evaluate(ERDEditorEmbedded.java:1) + at org.jkiss.dbeaver.ui.LoadingJob.run(LoadingJob.java:88) + at org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:119) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63) diff --git a/src/main/java/ru/practicum/shareit/booking/Booking.java b/src/main/java/ru/practicum/shareit/booking/Booking.java index f48b024..ad2b38b 100644 --- a/src/main/java/ru/practicum/shareit/booking/Booking.java +++ b/src/main/java/ru/practicum/shareit/booking/Booking.java @@ -1,22 +1,33 @@ package ru.practicum.shareit.booking; +import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; import ru.practicum.shareit.item.model.Item; import ru.practicum.shareit.user.model.User; import java.time.LocalDateTime; -/** - * TODO Sprint add-bookings. - */ +@NoArgsConstructor @AllArgsConstructor @Data +@Entity +@Table(name = "bookings") public class Booking { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - private LocalDateTime bookingStartDate; - private LocalDateTime endDateOfBooking; + @Column(name = "start_date") + private LocalDateTime start; + @Column(name = "end_date") + private LocalDateTime end; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "item_id", nullable = false) private Item item; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "booker_id", nullable = false) private User booker; - private RentalStatus rentalStatus; + @Enumerated(EnumType.STRING) + private RentalStatus status; } diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index f65090a..4947a00 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -1,7 +1,10 @@ -DROP TABLE IF EXISTS users CASCADE; -DROP TABLE IF EXISTS items CASCADE; +drop table IF EXISTS users CASCADE; +drop table IF EXISTS items CASCADE; +drop table IF EXISTS bookings CASCADE; +drop table IF EXISTS requests CASCADE; +drop table IF EXISTS comments CASCADE; -CREATE TABLE IF NOT EXISTS users ( +create TABLE IF NOT EXISTS users ( id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, name VARCHAR(255) NOT NULL, email VARCHAR(512) NOT NULL, @@ -9,14 +12,45 @@ CREATE TABLE IF NOT EXISTS users ( CONSTRAINT UQ_USER_EMAIL UNIQUE (email) ); -CREATE TABLE IF NOT EXISTS items ( +create TABLE IF NOT EXISTS items ( id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, name VARCHAR(255) NOT NULL, description VARCHAR(2000), available BOOLEAN DEFAULT TRUE, - owner_id BIGINT, - request_id BIGINT, + owner_id BIGINT NOT NULL, + --request_id BIGINT, CONSTRAINT pk_item PRIMARY KEY (id), CONSTRAINT fk_item_owner FOREIGN KEY (owner_id) REFERENCES users(id) --CONSTRAINT fk_item_request FOREIGN KEY (request_id) REFERENCES item_requests(id) -); \ No newline at end of file +); + +create TABLE IF NOT EXISTS bookings ( + id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + start_date TIMESTAMP WITHOUT TIME ZONE NOT NULL, + end_date TIMESTAMP WITHOUT TIME ZONE NOT NULL, + item_id BIGINT NOT NULL, + booker_id BIGINT NOT NULL, + status VARCHAR(10), + CONSTRAINT pk_booking PRIMARY KEY (id), + CONSTRAINT fk_booking_item FOREIGN KEY (item_id) REFERENCES items(id), + CONSTRAINT fk_booking_booker FOREIGN KEY (booker_id) REFERENCES users(id) +); + +create TABLE IF NOT EXISTS requests ( + id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + description VARCHAR(2000), + requestor_id BIGINT NOT NULL, + CONSTRAINT pk_request PRIMARY KEY (id), + CONSTRAINT fk_request_requestor FOREIGN KEY (requestor_id) REFERENCES users(id) +); + +create TABLE IF NOT EXISTS comments ( + id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + text VARCHAR(2000), + item_id BIGINT NOT NULL, + author_id BIGINT NOT NULL, + CONSTRAINT pk_comment PRIMARY KEY (id), + CONSTRAINT fk_cooment_item FOREIGN KEY (item_id) REFERENCES items(id), + CONSTRAINT fk_cooment_author FOREIGN KEY (author_id) REFERENCES users(id) +); + From 7c1cb14c60254da5e3a077dd7f724bc78e3f8907 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9?= Date: Wed, 2 Jul 2025 20:48:32 +0300 Subject: [PATCH 04/25] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20=D1=84=D1=83=D0=BD=D0=BA=D1=86?= =?UTF-8?q?=D0=B8=D1=8E=20=D0=B1=D1=80=D0=BE=D0=BD=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/shareIt.mv.db | Bin 57344 -> 65536 bytes .../shareit/booking/BookingController.java | 12 -- .../booking/controller/BookingController.java | 49 ++++++ .../booking/dto/BookingRequestDto.java | 22 +++ .../booking/dto/BookingResponseDto.java | 23 +++ .../booking/dto/mapper/BookingMapper.java | 48 +++++ .../shareit/booking/{ => model}/Booking.java | 3 +- .../booking/repository/BookingRepository.java | 39 ++++ .../booking/service/BookingService.java | 19 ++ .../booking/service/BookingServiceImpl.java | 166 ++++++++++++++++++ .../booking/{ => status}/RentalStatus.java | 2 +- .../shareit/error/ErrorResponse.java | 2 +- src/main/resources/application.properties | 12 +- src/main/resources/schema.sql | 20 +-- 14 files changed, 391 insertions(+), 26 deletions(-) delete mode 100644 src/main/java/ru/practicum/shareit/booking/BookingController.java create mode 100644 src/main/java/ru/practicum/shareit/booking/controller/BookingController.java create mode 100644 src/main/java/ru/practicum/shareit/booking/dto/BookingRequestDto.java create mode 100644 src/main/java/ru/practicum/shareit/booking/dto/BookingResponseDto.java create mode 100644 src/main/java/ru/practicum/shareit/booking/dto/mapper/BookingMapper.java rename src/main/java/ru/practicum/shareit/booking/{ => model}/Booking.java (89%) create mode 100644 src/main/java/ru/practicum/shareit/booking/repository/BookingRepository.java create mode 100644 src/main/java/ru/practicum/shareit/booking/service/BookingService.java create mode 100644 src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java rename src/main/java/ru/practicum/shareit/booking/{ => status}/RentalStatus.java (65%) diff --git a/db/shareIt.mv.db b/db/shareIt.mv.db index 67bef77616c0fb8637676949a74d1f9f4fcd3c6e..cd4f35e1545e7480bbf0bd7ceae3d5e0fa34eb62 100644 GIT binary patch literal 65536 zcmeHwTWsT4nx0%`x>!~1x^z`_UHURAS5;S4x7$q~-i;(%)Wx_-0zt47*JnKYLTj##oJ zidO>upU(lG13m|Q4)`4KIpA}^=YY=vp94Mzd=B^=@Hy~H;=r0e|NkX%-oLHS0iOdt z2Ye3r9Pl~dbHL|-&jFtUJ_mdb_#F7fabWb2pINMt#q}G{_dZ<+nK+;=WZ|lr~l$^=YIXcqbCnPq6NhiuxOdItjm~~ibWeN zFUVNHfxz5vJlUVQ@F+mTyAH@?6$AwyBUv(NmPH0qI0gzlj~S%XEH4p8;`mFfDC#Ur zXqK=F%L-7%k_31S!lIEVOT2{)8cB>PFd_p5-Ozb#(nuzfu5&Dnbjv`NtkcNAM6j?# zBcij0$O<&Fc#~mu@e;ChlT#R)L%K)=j)MXbuq8l2VhqVJ1SqfyCo%@j$&3tCA(~Sx z9>Fls97c?yurkdVmLL$Q!*hZpAYO-pVj)wOXkIZ4MMs$C4TeXoXwkeS@}^?ww15~6 z2H2tn4w)F5fP!I~*pg{MW;mU*SYRp^F(a{$>}F}HjF#&At+w4HOQyc0b!xRdu60NR zw{fnwNBlZIf4+`vEFP1w_Q6uV|CSLkT|sk%?C}aVKmvPDj#UPM%-G$bC=P4QT^br! zUpRf?oF<%aK=5X%zTh1f(>93kQmEG^YO{%ZLvalRF8$V{?_Id?Byi-#1fB3Yk$74l z*uboUX_1w|Kud%c!H$EGXQ4nO4(lQEH)PR(BO*(Xq?l09Mb^+2T9i1! zLM%gz3g#pZ9Hoe5f(SS`5u388m~gpnDoEgDS~NMGP|6S(Kx#aFFjC%VUJnrx&$7L5U zz~9W->dv0C?!_~VW970oH?d!5Q21tqh(@(=L07w zTNuIAil-G(G)xN#P{1&=B+4a4mN291w4!hpHW-#xuwV&1hAM_7u_DjY;LBt|HY^(R zjLCA~|1mE*t(Y{H5F=rOqcP0MB$kwDKyq2MLXvRVoqIC%-fQo5B!8G6pm&**64ACj@jBH8*4UH;rSJNrz zSeM{(Z0ZIAnsq~wEdo5yffra7L|V6W0fG$XY$NP&cXsCOm+j!OIfom}CG19N7{|T+ zUHEnwnYW+MK7~uCPTzewoVbMMi;XWfu%hZ+=<+qi*OdPH`rB_D0)Z<}xzg-~j{>7- zFSNn466OU01qe1xUZ4$uQv|~@pdhhWU=eL#o-iC@X#+5%;>aZvGq6|%XAB5KO;ex=LP*y|1O-mASgg}TGT|U+(nK+c$vLO6 zP8bAXH8BheJ5O%lIA;-fmP0I7hi5+`Z6OX;rr-gK1y6`zWsRdPPB$RbMYP5962n8F zZ7GUiB156!!Hy^!5Hee^?8NJmPFtpFaH3$*7BM6Y4|LxCf%7T!{m!@2@A%&H8|ppL zvAH&^BPDD-3y=Qbm4zhUdmO6SdItPKlQazS*ol~YBlcY|VxOHwFp{K=eVORLs`2*C z!{N!vhnM~>Ma}eI?795B|3c4|zx-nU?lpK>=Pzf-95o-9xo~lon!7|_zH;@Q`M|^A z$J^OxE*Q>4)m*d~+KeS4L4^2);KKYrn&}@6Zf2vIU~DC*rEGg_ySb3<<*X<8`A+HI|rE8DjXO%2%F04nCUy2LnC~sq^sQ z=c7BDQ!}~XRxGy`WP_QgXIBt{p=ctdt!9h4RMF-5li@0zhls(^ zA{;G(45c*BxxpYgy!0$Pyz0n+ssa~4J`Bg%JbP9=Tqvl@nX7Cv&;#lp1lcLv36#y23C(L z_0izFax?ob$arV6h>xnCs@sEF=T&cYVfGeuK|r0|x!!Yhh6T4#!w@blX#zG^{r4#Y8rFqrnlI?t;Dhf5TbFlvqFGgzPW{ zc|+koFNBl`FL1@Myb>z%(NLtQsNrx?5Y-Tm_((V^$|vmIIRcRZ`Kc*k#_T;XN%euG zoFU3T8@Xd9>3CE>d;eS}h&^V4j>e;Jf*wpaL8GdtnxH|g^O_)bVfKCKNNKv34H_;E zw$2c^B6>=XJXMeD+6U0je?LXn2A6^7nL3RDV|0R^W9l|`^NAXFqJ^U#on7fZ1f~0@ zuLv^2sbmtS%x_BR;B%W0$BSxFfM^2d*kK0d3>*X*5lLmEGOP*ku-q^V#s|(l7v0WH za_!!*e`wT)3j)WQP&adHQ#J9U^J(JQ`f$1?LZmt$8wjvxdh3Z2y%TH|crq3Z9F0<6 z6@wt6`;()AQPt@Z3KQ)?t@ElP5H|Y|x^hZ55Kg5WfjTW57?B9G`-$Pe0(5U$I54_+ zdjCKJy;K}izTqt=>YewxBX2!XDvwGF)y}TETcn&n7EakYAMQxKdj(>^j;=;-+B-<4wG4RH|DA zyM`Mk=Fw3VE|)G>YQd~g#&w-EOQgBA(j=sg8>0N8hs(C@G{h&hN&^Q&gft6kvxgfE z%*!vzc6)dyA)9Mfj0$!ds?_VGwwWOZi1Stv(-B-F!7y$%?ON^2IH|PD@Xb}tYS|5M zJ!vD2+pS)3N4FaWuI_AAYEWY-gWF~9h$4#4B(X_ql?Dk$@P4JWnXpT^0k<3xOt z&FZ8P%#ezcUb_85wMGtrc(SxpA$1}v-uqHlH=@l-HJIxF%i3-7MWS+ui`h1AwC#o@ zdD?wvV+;4-zFVXMd}@3@T7#NPt4*lM37&fM8I9Cx6%t&vYi0vDt3pKreDyGnx>m?n zoG;S)yldLTB+Xzl^8I+FQ7Wc!#~{_Q`qwiN_*xd~tPx11-DnioNDFqC)^W9?+uc^R zax}QqjbsM*f{}_*t!%1JbyM-2y_pZgCr!PeD?jZDZnQ`vr`ZiGah_W5rnc(Ac&l6^ z%}OI5>6kUrL%gTLtyI=wSTNIRw8;%UM|{%TelsdiQ7((zF5a~jBCa0p7R*6>FL$ojcgfr z8=zL@iV=)`k?HJ#1T95DN!p5+i}y0QGOAsFcjmR#vzeCDolNlk2IGY^{d&fV5(JVfT(<-nw54B7vqHJzzq+v zA8K*3UjfwtwaaI*BgV2SNdj)vncg zTM=Ao^>}8iu>}|=yN+89M;jH={K2|SibqNVvUg-S9;H)t3>pTHia}iT9In}o;%cV_ z-EtHRWXh|-kMrxK(Wtmg>kXck~y%xwo zG1&pCNmKT6>*E}VU(;@Q1R&I`IQ6`>o+f}p?ig)`nz+*7z2@&(b`5N8g|r=`T(7j- zMb&8mY;GNwI-s6oy?CAha&0is*-G7RR9Zg(*HOVm&{()e5XS0$vb74A*G$*=I>w~| z-S{Fxx^R;vu$awpllAEaXc?G6#}1K3tB}Bu{r|WJp%$|luuou(>_)5NG`$0MqBv9( z4;MenW$nf;xSDnajHP1(4WP0_YIZScM8GP7G2+Gte<`_cL(_>$!~8M{5nfo6soT6?J-?R+souAF! z4}37yAYD1tch669txrx95=|PC*~!7sg9*0!=}86sIDb;3gHz4i!%0@{ zvsX#}CsVcZ-3hMz^HXL1ooRuNctRE)Pqcp*Cxw=Gra0^GoyA35KP~!sZ>n<#QN8fT zWO4pya~}jwlg#^*-SgrU%fz0d;I~f;cIKu>!`G$-g11hIv_73|Vwa}dzN=HCUHW8T z{rnW)Fmrqka`Qw)$xJkq_ol{8C#Mp3r$%ERPKZ_blLqk7D}4I<)8i=abi4b}sX@@C zDYF^jbo+Z@(##En_)^07t80Hc_x@;J=)USQ{#Y=;YWwB=jM+*y+2}k<Y@9`OyS zQ$XO1Qir8pJbh^5ayt_-yOxsA=2dpTB;}ZnifRSZX14QuE-k3kHBPHmG8=L=mrDxs z=%ta2ajkrJL(0_llVzhR?v~{APH2s+ZzXi;pxf$p?TzYg4zd_*hw=s^zM!u2TC7)H z>mW_T_X=wXV-P8ey^-B`#E}(N<#J z3`Gi&46~EaY%847L)+p@wXl=h6Oc;XrY>uEExA`IHFY&T$u|?B6xrTstJEFpiYBgZS~)%4Q>*jHikNmb5{ayl zoodRk_gD8;!W}8Qv6f!5+G;}-w`8s~k75Fa4yDfHV;g}$XEqDP*rQW07(F)>0SXax1 zwemcQW;bzNIo#}3b-fVUAiXF|@=Cicf!)|o#M0gMMkWPQ6|L5-sZt?PU&+6q?o#vG zPOrUM&5(LC41KArZ>uGXi^V&coko>E%pG>N)8Q5EawBoDF^@`XD7um_!5mL+B?{{`5ob4}5n?5+R!EBXGQy#OLuw*r zWLZtCbh|?L1@(Zsu3^Z1QA-szG;1CeaxK=hV!LA8I>>iRot=E4+$J{8h|*U5Ku=ZI z)0=5)tB0)SORe=%+dq6keL&sN3NhAB?R8Mfm`5Vl3T>|8Ts@H%cX1@Q*9v93wUyYe zx|P{psafrvR!2T8p)Swr`7R+=;sx~)byJJ2>$ZFlu{p3Dy<8?7(KMak)C@6Fu5wZ@ z-r(6oZKJ(jLhs+6sgzN<7opW?PMyOM* z?dZ#V=x}%UAZh1t3sQR^J9V&b?r(;A`^mk0lkYWz{QiEnw1+HBQK`q&ZLPgST71OL z2?(rUE0y4DE#`22C#SyLjjgTaq=T&$(~7(lrD{2y>Xsy&G4%~&CnT(~xT~tv$J8Bd zyHIbl`{hy>3{W-G3!9y0s}tiQ;jKeEX9#t^Syi?AZZ&$iW+TnoG1GO93)dmN$;)s8 zbnY4To>tPf!qr0epa-UOZ$G7E@@%f0UCorc;c(5`D}~HljnNKk8|(Udu9D97;Qc$n zKHMxZ>#HF{r9PqVYN%aqiuKycHam~@JN3NOGqd>~Ua7`%mZ>#c62G5NH`!J%QAxzw zO_8rAgqJ(@CaOpFx3NksQunm&YPhqR+wZh$ARpoGel)ksXLB!8-RMj9a2w}PL@exf z_d!H#lCWxFIk(ebY_5dMVdYlPsEfJUB#_=R8BVzv!N}tBj}dc z+{pD-i7s!bs!4K%marq4J1yCk^*xN+p)}sy!>mei)cabFRYDyLl96%qC@jQ#;T45H zD8)#w+9@Y@Gp$NJ9ox$`Wud(#HFwi_E>}OS#*-^MYe}=hsFVQC^vn8hUH>!3mr_?Q zP}eR}*Jr646m@fsdiN4_i>7X0rtVy!?p&qbdxyF^Pu;slJ-AMNaD)2jCKY^_TDV0$ zzD<36hkEuN^~qgo@gDX0eTscRaqqir&!GB~8~=Ik@{ywsuvh>3N5Ashzw_fqfvbNr zD1cdi65mo|@Q&UpnsE9y1@rxMI+MyrBb;;opZxyda<>4M^!e~|e!}VZs85Hdg$bwc zQlAY^i_Yo){fC3b-2#|4W_Vh<`d2^tm7n~Fp8)Al_*Z`d1?oP9Mzm41bNs9SI;ikJ z{<~A*0mUCxxICf4`;<7U0K@UL)wucR4#%il7pU78sXMb^<*B=K)V)j8eVTf3nR*{; zLA8JJ?q9goo?M`wUZkGSQlC=PXLA&Di9$5RU#3K;Mg7lxa%<+300rp@myr9PyX2HP zfgNnoU^_g{5B7z@Rvc`l!B!q@mBAJdw)$Xe47TQAOWeB(?tjt!FS-9^_rEgNz;&`z zoOd@c%_av+EH}2Nc=r%HwkLV_xUuUv;T=z#Qhx`&eQEE!w!wTL#G`M~L98$cOao!!}x_g^8sqew389>4{ zcfZpxZCJ}+V#jxp%c13>OWX2s+8#QWE{`r9U{4Oxzb(UOeR#YEnovV=+vt-GD3&gI zrMHE}D(Ni`vvVxMlF#xmwO0Si{-{Y)uN2U0(Uh2K;Fu~;5U8fT~$e=ahu6=^h5FPX+f1OJqG0KEX2Lg4z zq45%o&Nnt*HlgW#^|EQ0_tJY;ZaTpr5l#-W34QIei4&#{4zS6|S~hm+#~uM@CP?cb zDd!WnT3_o=)*61H`n=!RNI6f|9Om{MwFj2Ntu_2c)+KJ3m90GvbUq!_5e=C&3TH&ww8XKVil>!om;1`cA$3H@5@xfh%s#+9kxX z269OBHj@NmIMT_BV)j_n@(1fgcuxVL==gq+vlG7LAn zr^~HX_DR~!o$F-G9i+~64klseL=s)e$)bBQiLSEPX>?iuush7D+uv2&Bc*~Ie4a$R zK+Z73?xJlNoju$zddrYB&tk3LJtBGl?Yk_yM6<&jzl+Cd<^lD0I?0BU_!qL_D!e!E zFFr5HmP;~cG9HQSer;GBa z6&AAC8f0{iXW@bQ(H`QN(H?w1&KfMl7heSepZ;op3t5JpeJ9JXvvslzJ6p&y90<(3 z2wZ;n@A_N#Xvx`!kCp;~pZ!tbS{~9vIa_%2?`+}Ge<1LufxwMljrO;&n(pkwYC3FR z1aAKIufz7Mz^#A%k74^qfm{FaPXYnBh3#i>5dQA`P6l4;b4b@+ zar#D)o^!k4|MNNEbHL}ocb5ahzyk8@_w(=X_w!pXBPaE~RU>WZHK%3B$;-(i#?D8g zuk)`TKsh&KkHrQ~4CBNDFr^;L{tw3{L;=JTlt5E%_J5WcdivKzG35WhxDfokK;YVx zAaE29BF2vgztQpFZ;zr^Py^k07YfiMjv-VWg|94sGUkSFzD`Q7BfBTVZetL`dgE-k zcuW;1#My3R%v%?^f-(K{pMN{B7|xZye)b!UsqzN7j7NAv&T{M$3>V7>Ey3-IOeYr@ex znvWmN|4%&77(K)|z5+1$(S`T11VV2T|L>0n_UOc|3S7=GmqZ}Y4ok)*SCs3{@*u#wFSOe z`0&!d8Q}kY73kytedT;gJH-Dh`S^c6{@*xm;TRr)kN-E0A2^1>H^}op4b{-c|64eY zKzTL{ykn3Y=RwXq2kefI|K|mw__pHzwSD|Q2l-`)cJn&mZ_kE#cT9<0uktEzzo?J@ zmx%iKe@6(I4sKi@$#M$dkB|R1V9yX??>OL(kN@|z;l9rXsCUfXog)w#19cl3>S1#L zN$TVO4LEdO&@mtXFXu%xJTuDHtdIZa37I^a=;QzS_G+3^2LKK>tI3i|keeQ-e^|8LpH|8sF6`%rX~uo->)KeBuT z&N&^j?`_5Z``a=6Kg1m2y#VIxF9QE>1V(ZqUG5PW$yxCKoE*BR0Feyv|Ex*4B!DgH zg$SB}OL83l4*+@k2r6F-|4*KV{4)kw_-c~bAu7-W{69Cf@Cg6UWzq=$&)pm0|G70s z_;LB8{z-;_lEd??%oLhufI3M|8w@fQ6PFg{vW(%;s5y@@Hyaf;G4;TQU3p7 zK;d!j=qUd`#~?+Pv2m2S|MirP^8a&Z#Q&R!0xXV!rEzZ-|LVfk*Km^5em& z_o3A%b^Vt#{`}zNU{68Q6ufE?;lx*rJ6NR58GuP{?bFREg zXH#%L|G%IA|MfbSvk3dS1o@ZJ;Muh28;t+=b@Km@=KsU_w`cy(dFKBtW5^1YU(c-n IsFf@KA6t73X#fBK literal 57344 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 diff --git a/src/main/java/ru/practicum/shareit/booking/BookingController.java b/src/main/java/ru/practicum/shareit/booking/BookingController.java deleted file mode 100644 index b94493d..0000000 --- a/src/main/java/ru/practicum/shareit/booking/BookingController.java +++ /dev/null @@ -1,12 +0,0 @@ -package ru.practicum.shareit.booking; - -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * TODO Sprint add-bookings. - */ -@RestController -@RequestMapping(path = "/bookings") -public class BookingController { -} diff --git a/src/main/java/ru/practicum/shareit/booking/controller/BookingController.java b/src/main/java/ru/practicum/shareit/booking/controller/BookingController.java new file mode 100644 index 0000000..a6a71d7 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/booking/controller/BookingController.java @@ -0,0 +1,49 @@ +package ru.practicum.shareit.booking.controller; + +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; +import ru.practicum.shareit.booking.dto.BookingRequestDto; +import ru.practicum.shareit.booking.dto.BookingResponseDto; +import ru.practicum.shareit.booking.service.BookingService; + +import java.util.List; + +@RequiredArgsConstructor +@Slf4j +@RestController +@RequestMapping(path = "/bookings") +public class BookingController { + private final BookingService bookingService; + + @PostMapping + public BookingResponseDto createBooking(@RequestHeader("X-Sharer-User-Id") Long userId, @Valid @RequestBody BookingRequestDto bookingRequestDto) { + log.info("POST /bookings"); + return bookingService.createBooking(userId, bookingRequestDto); + } + + @PatchMapping("/{bookingId}") + public BookingResponseDto updateBooking(@RequestHeader("X-Sharer-User-Id") Long userId, @PathVariable("bookingId") Long bookingId, @RequestParam(name = "approved") Boolean approved) { + log.info("PATCH /bookings/{}", bookingId); + return bookingService.updateBooking(userId, bookingId, approved); + } + + @GetMapping("/{bookingId}") + public BookingResponseDto findBookingById(@RequestHeader("X-Sharer-User-Id") Long userId, @PathVariable("bookingId") Long bookingId) { + log.info("GET /bookings/{}", bookingId); + return bookingService.findBookingById(userId, bookingId); + } + + @GetMapping + public List findUserBookings(@RequestHeader("X-Sharer-User-Id") Long userId, @RequestParam(name = "state", defaultValue = "ALL") String state) { + log.info("GET /bookings?state={}.", state); + return bookingService.findUserBookings(userId, state); + } + + @GetMapping("/owner") + public List findOwnerReservedItems(@RequestHeader("X-Sharer-User-Id") Long userId, @RequestParam(name = "state", defaultValue = "ALL") String state) { + log.info("GET /bookings/owner?state={}.", state); + return bookingService.findOwnerReservedItems(userId, state); + } +} diff --git a/src/main/java/ru/practicum/shareit/booking/dto/BookingRequestDto.java b/src/main/java/ru/practicum/shareit/booking/dto/BookingRequestDto.java new file mode 100644 index 0000000..904ead3 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/booking/dto/BookingRequestDto.java @@ -0,0 +1,22 @@ +package ru.practicum.shareit.booking.dto; + +import jakarta.validation.constraints.Future; +import jakarta.validation.constraints.FutureOrPresent; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.time.LocalDateTime; + +@AllArgsConstructor +@Data +public class BookingRequestDto { + @NotNull + private Long itemId; + @FutureOrPresent + @NotNull + private LocalDateTime start; + @Future + @NotNull + private LocalDateTime end; +} diff --git a/src/main/java/ru/practicum/shareit/booking/dto/BookingResponseDto.java b/src/main/java/ru/practicum/shareit/booking/dto/BookingResponseDto.java new file mode 100644 index 0000000..85d4b60 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/booking/dto/BookingResponseDto.java @@ -0,0 +1,23 @@ +package ru.practicum.shareit.booking.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Data; +import ru.practicum.shareit.booking.status.RentalStatus; +import ru.practicum.shareit.item.dto.ItemDto; +import ru.practicum.shareit.user.dto.UserDto; + +import java.time.LocalDateTime; + +@AllArgsConstructor +@Data +public class BookingResponseDto { + private Long id; + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") + private LocalDateTime start; + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") + private LocalDateTime end; + private ItemDto item; + private UserDto booker; + private RentalStatus status; +} diff --git a/src/main/java/ru/practicum/shareit/booking/dto/mapper/BookingMapper.java b/src/main/java/ru/practicum/shareit/booking/dto/mapper/BookingMapper.java new file mode 100644 index 0000000..b5c5d12 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/booking/dto/mapper/BookingMapper.java @@ -0,0 +1,48 @@ +package ru.practicum.shareit.booking.dto.mapper; + +import lombok.experimental.UtilityClass; +import ru.practicum.shareit.booking.dto.BookingRequestDto; +import ru.practicum.shareit.booking.dto.BookingResponseDto; +import ru.practicum.shareit.booking.model.Booking; +import ru.practicum.shareit.booking.status.RentalStatus; +import ru.practicum.shareit.item.dto.ItemDto; +import ru.practicum.shareit.item.model.Item; +import ru.practicum.shareit.user.dto.UserDto; +import ru.practicum.shareit.user.model.User; + +@UtilityClass +public class BookingMapper { + public static BookingResponseDto toBookingDto(Booking booking) { + ItemDto itemDto = new ItemDto(booking.getItem().getId(), + booking.getItem().getName(), + booking.getItem().getDescription(), + booking.getItem().getAvailable() + ); + + UserDto bookerDto = new UserDto( + booking.getBooker().getId(), + booking.getBooker().getName(), + booking.getBooker().getEmail() + ); + + return new BookingResponseDto( + booking.getId(), + booking.getStart(), + booking.getEnd(), + itemDto, + bookerDto, + booking.getStatus() + ); + } + + public static Booking toBooking(BookingRequestDto bookingRequestDto, Item item, User booker, RentalStatus status) { + return new Booking( + null, + bookingRequestDto.getStart(), + bookingRequestDto.getEnd(), + item, + booker, + status + ); + } +} diff --git a/src/main/java/ru/practicum/shareit/booking/Booking.java b/src/main/java/ru/practicum/shareit/booking/model/Booking.java similarity index 89% rename from src/main/java/ru/practicum/shareit/booking/Booking.java rename to src/main/java/ru/practicum/shareit/booking/model/Booking.java index ad2b38b..ee93758 100644 --- a/src/main/java/ru/practicum/shareit/booking/Booking.java +++ b/src/main/java/ru/practicum/shareit/booking/model/Booking.java @@ -1,9 +1,10 @@ -package ru.practicum.shareit.booking; +package ru.practicum.shareit.booking.model; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import ru.practicum.shareit.booking.status.RentalStatus; import ru.practicum.shareit.item.model.Item; import ru.practicum.shareit.user.model.User; diff --git a/src/main/java/ru/practicum/shareit/booking/repository/BookingRepository.java b/src/main/java/ru/practicum/shareit/booking/repository/BookingRepository.java new file mode 100644 index 0000000..4b8580f --- /dev/null +++ b/src/main/java/ru/practicum/shareit/booking/repository/BookingRepository.java @@ -0,0 +1,39 @@ +package ru.practicum.shareit.booking.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import ru.practicum.shareit.booking.model.Booking; +import ru.practicum.shareit.booking.status.RentalStatus; +import ru.practicum.shareit.user.model.User; + +import java.util.List; + +public interface BookingRepository extends JpaRepository { + @Query("SELECT b FROM Booking AS b WHERE b.booker = :booker AND CURRENT_TIMESTAMP BETWEEN b.start AND b.end ORDER BY b.start DESC") + List findCurrentBookings(@Param("booker") User booker); + + @Query("SELECT b FROM Booking AS b WHERE b.booker = :booker AND b.end < CURRENT_TIMESTAMP ORDER BY b.start DESC") + List findPastBookings(@Param("booker") User booker); + + @Query("SELECT b FROM Booking AS b WHERE b.booker = :booker AND b.start > CURRENT_TIMESTAMP ORDER BY b.start DESC") + List findFutureBookings(@Param("booker") User booker); + + List findByBookerAndStatusOrderByStartDesc(User booker, RentalStatus status); + + List findByBookerOrderByStartDesc(User booker); + + @Query("SELECT b FROM Booking AS b WHERE b.item.owner = :owner AND CURRENT_TIMESTAMP BETWEEN b.start AND b.end ORDER BY b.start DESC") + List findCurrentItemsBookings(@Param("owner") User owner); + + @Query("SELECT b FROM Booking AS b WHERE b.item.owner = :owner AND b.end < CURRENT_TIMESTAMP ORDER BY b.start DESC") + List findPastItemsBookings(@Param("owner") User owner); + + @Query("SELECT b FROM Booking AS b WHERE b.item.owner = :owner AND b.start > CURRENT_TIMESTAMP ORDER BY b.start DESC") + List findFutureItemsBookings(@Param("owner") User owner); + + List findByItemOwnerAndStatusOrderByStartDesc(User owner, RentalStatus status); + + @Query("SELECT b FROM Booking AS b WHERE b.item.owner = :owner ORDER BY b.start DESC") + List findByItemOwnerOrderByStartDesc(@Param("owner") User owner); +} diff --git a/src/main/java/ru/practicum/shareit/booking/service/BookingService.java b/src/main/java/ru/practicum/shareit/booking/service/BookingService.java new file mode 100644 index 0000000..a1c582c --- /dev/null +++ b/src/main/java/ru/practicum/shareit/booking/service/BookingService.java @@ -0,0 +1,19 @@ +package ru.practicum.shareit.booking.service; + + +import ru.practicum.shareit.booking.dto.BookingRequestDto; +import ru.practicum.shareit.booking.dto.BookingResponseDto; + +import java.util.List; + +public interface BookingService { + BookingResponseDto createBooking(Long userId, BookingRequestDto bookingRequestDto); + + BookingResponseDto updateBooking(Long userId, Long bookingId, Boolean approved); + + BookingResponseDto findBookingById(Long userId, Long bookingId); + + List findUserBookings(Long userId, String state); + + List findOwnerReservedItems(Long userId, String state); +} diff --git a/src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java b/src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java new file mode 100644 index 0000000..e1ae179 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java @@ -0,0 +1,166 @@ +package ru.practicum.shareit.booking.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import ru.practicum.shareit.booking.dto.BookingRequestDto; +import ru.practicum.shareit.booking.dto.BookingResponseDto; +import ru.practicum.shareit.booking.dto.mapper.BookingMapper; +import ru.practicum.shareit.booking.model.Booking; +import ru.practicum.shareit.booking.repository.BookingRepository; +import ru.practicum.shareit.booking.status.RentalStatus; +import ru.practicum.shareit.exception.NotFoundException; +import ru.practicum.shareit.exception.ValidationException; +import ru.practicum.shareit.item.model.Item; +import ru.practicum.shareit.item.repository.ItemRepository; +import ru.practicum.shareit.user.model.User; +import ru.practicum.shareit.user.repository.UserRepository; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +@RequiredArgsConstructor +@Slf4j +@Service +public class BookingServiceImpl implements BookingService { + private final BookingRepository bookingRepository; + private final UserRepository userRepository; + private final ItemRepository itemRepository; + + @Override + public BookingResponseDto createBooking(Long userId, BookingRequestDto bookingRequestDto) { + User booker = validateUser(userId); + Item item = validateItem(bookingRequestDto.getItemId()); + + if (Objects.equals(item.getOwner().getId(), userId)) { + log.warn("Владелец не может бронировать свою вещь"); + throw new ValidationException("Владелец не может бронировать свою вещь"); + } + if (!item.getAvailable()) { + log.warn("Данная вещь недоступна для бронирования"); + throw new ValidationException("Данная вещь недоступна для бронирования"); + } + + if (!bookingRequestDto.getStart().isBefore(bookingRequestDto.getEnd())) { + log.warn("Период указан неверно"); + throw new ValidationException("Период указан неверно"); + } + + RentalStatus status = RentalStatus.WAITING; + + return BookingMapper.toBookingDto(bookingRepository.save(BookingMapper.toBooking(bookingRequestDto, item, booker, status))); + } + + @Override + public BookingResponseDto updateBooking(Long userId, Long bookingId, Boolean approved) { + Booking booking = validateBooking(bookingId); + + if (!Objects.equals(userId, booking.getItem().getOwner().getId())) { + log.warn("Обновить аренду может только владелец вещи"); + throw new ValidationException("Обновить аренду может только владелец вещи"); + } + + if (!Objects.equals(booking.getStatus(), RentalStatus.WAITING)) { + log.warn("Статус уже был установлен"); + throw new ValidationException("Нельзя изменить статус: бронирование уже подтверждено или отклонено"); + } + + booking.setStatus(approved ? RentalStatus.APPROVED : RentalStatus.REJECTED); + + return BookingMapper.toBookingDto(bookingRepository.save(booking)); + } + + @Override + public BookingResponseDto findBookingById(Long userId, Long bookingId) { + Booking booking = validateBooking(bookingId); + + if (!Objects.equals(booking.getItem().getOwner().getId(), userId) && !Objects.equals(booking.getBooker().getId(), userId)) { + log.warn("Данный пользователь не может получить информацию по бронированию"); + throw new ValidationException("Данный пользователь не может получить информацию по бронированию"); + } + + return BookingMapper.toBookingDto(booking); + } + + @Override + public List findUserBookings(Long userId, String state) { + User booker = validateUser(userId); + List bookerBookings = new ArrayList<>(); + + switch (state) { + case "CURRENT": + bookerBookings = bookingRepository.findCurrentBookings(booker); + break; + case "PAST": + bookerBookings = bookingRepository.findPastBookings(booker); + break; + case "FUTURE": + bookerBookings = bookingRepository.findFutureBookings(booker); + break; + case "WAITING": + bookerBookings = bookingRepository.findByBookerAndStatusOrderByStartDesc(booker, RentalStatus.WAITING); + break; + case "REJECTED": + bookerBookings = bookingRepository.findByBookerAndStatusOrderByStartDesc(booker, RentalStatus.REJECTED); + break; + case "ALL": + default: + bookerBookings = bookingRepository.findByBookerOrderByStartDesc(booker); + break; + } + + return bookerBookings.stream() + .map(BookingMapper::toBookingDto) + .collect(Collectors.toList()); + } + + @Override + public List findOwnerReservedItems(Long userId, String state) { + User owner = validateUser(userId); + List ownerBookings = new ArrayList<>(); + + switch (state) { + case "CURRENT": + ownerBookings = bookingRepository.findCurrentItemsBookings(owner); + break; + case "PAST": + ownerBookings = bookingRepository.findPastItemsBookings(owner); + break; + case "FUTURE": + ownerBookings = bookingRepository.findFutureItemsBookings(owner); + break; + case "WAITING": + ownerBookings = bookingRepository.findByItemOwnerAndStatusOrderByStartDesc(owner, RentalStatus.WAITING); + break; + case "REJECTED": + ownerBookings = bookingRepository.findByItemOwnerAndStatusOrderByStartDesc(owner, RentalStatus.REJECTED); + ; + break; + case "ALL": + default: + ownerBookings = bookingRepository.findByItemOwnerOrderByStartDesc(owner); + break; + } + + return ownerBookings.stream() + .map(BookingMapper::toBookingDto) + .collect(Collectors.toList()); + } + + private User validateUser(Long userId) { + return userRepository.findById(userId) + .orElseThrow(() -> new NotFoundException("Пользователь с данным id: " + userId + " не найден")); + } + + private Item validateItem(Long itemId) { + return itemRepository.findById(itemId) + .orElseThrow(() -> new NotFoundException("Вещь с данным id: " + itemId + " не найден")); + } + + private Booking validateBooking(Long bookingId) { + return bookingRepository.findById(bookingId) + .orElseThrow(() -> new NotFoundException("Бронирование с данным id:" + bookingId + " не найдено")); + } +} diff --git a/src/main/java/ru/practicum/shareit/booking/RentalStatus.java b/src/main/java/ru/practicum/shareit/booking/status/RentalStatus.java similarity index 65% rename from src/main/java/ru/practicum/shareit/booking/RentalStatus.java rename to src/main/java/ru/practicum/shareit/booking/status/RentalStatus.java index 5d4afad..a36dfb1 100644 --- a/src/main/java/ru/practicum/shareit/booking/RentalStatus.java +++ b/src/main/java/ru/practicum/shareit/booking/status/RentalStatus.java @@ -1,4 +1,4 @@ -package ru.practicum.shareit.booking; +package ru.practicum.shareit.booking.status; public enum RentalStatus { WAITING, diff --git a/src/main/java/ru/practicum/shareit/error/ErrorResponse.java b/src/main/java/ru/practicum/shareit/error/ErrorResponse.java index 76b0cb2..637fb8c 100644 --- a/src/main/java/ru/practicum/shareit/error/ErrorResponse.java +++ b/src/main/java/ru/practicum/shareit/error/ErrorResponse.java @@ -5,7 +5,7 @@ @AllArgsConstructor @Getter -class ErrorResponse { +public class ErrorResponse { private final String error; private final String description; } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index ad37e60..8247864 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,7 +1,10 @@ spring.jpa.hibernate.ddl-auto=none -spring.jpa.properties.hibernate.format_sql=true spring.sql.init.mode=always +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.format_sql=true +logging.level.org.hibernate.SQL=DEBUG +logging.level.org.hibernate.type.descriptor.sql=TRACE logging.level.org.springframework.orm.jpa=INFO logging.level.org.springframework.transaction=INFO logging.level.org.springframework.transaction.interceptor=TRACE @@ -13,3 +16,10 @@ spring.datasource.url=jdbc:h2:file:./db/shareIt spring.datasource.username=db spring.datasource.password=12345 + + + + + + + diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 4947a00..3b6c92f 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -1,10 +1,10 @@ -drop table IF EXISTS users CASCADE; -drop table IF EXISTS items CASCADE; -drop table IF EXISTS bookings CASCADE; -drop table IF EXISTS requests CASCADE; -drop table IF EXISTS comments CASCADE; +DROP table IF EXISTS users CASCADE; +DROP table IF EXISTS items CASCADE; +DROP table IF EXISTS bookings CASCADE; +DROP table IF EXISTS requests CASCADE; +DROP table IF EXISTS comments CASCADE; -create TABLE IF NOT EXISTS users ( +CREATE TABLE IF NOT EXISTS users ( id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, name VARCHAR(255) NOT NULL, email VARCHAR(512) NOT NULL, @@ -12,7 +12,7 @@ create TABLE IF NOT EXISTS users ( CONSTRAINT UQ_USER_EMAIL UNIQUE (email) ); -create TABLE IF NOT EXISTS items ( +CREATE TABLE IF NOT EXISTS items ( id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, name VARCHAR(255) NOT NULL, description VARCHAR(2000), @@ -24,7 +24,7 @@ create TABLE IF NOT EXISTS items ( --CONSTRAINT fk_item_request FOREIGN KEY (request_id) REFERENCES item_requests(id) ); -create TABLE IF NOT EXISTS bookings ( +CREATE TABLE IF NOT EXISTS bookings ( id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, start_date TIMESTAMP WITHOUT TIME ZONE NOT NULL, end_date TIMESTAMP WITHOUT TIME ZONE NOT NULL, @@ -36,7 +36,7 @@ create TABLE IF NOT EXISTS bookings ( CONSTRAINT fk_booking_booker FOREIGN KEY (booker_id) REFERENCES users(id) ); -create TABLE IF NOT EXISTS requests ( +CREATE TABLE IF NOT EXISTS requests ( id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, description VARCHAR(2000), requestor_id BIGINT NOT NULL, @@ -44,7 +44,7 @@ create TABLE IF NOT EXISTS requests ( CONSTRAINT fk_request_requestor FOREIGN KEY (requestor_id) REFERENCES users(id) ); -create TABLE IF NOT EXISTS comments ( +CREATE TABLE IF NOT EXISTS comments ( id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, text VARCHAR(2000), item_id BIGINT NOT NULL, From 9a23744df9fb7e09435b7ecf56ee2b693b0c9929 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9?= Date: Wed, 2 Jul 2025 23:30:33 +0300 Subject: [PATCH 05/25] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D0=B4=D0=B0=D1=82=D1=8B=20=D0=B1=D1=80=D0=BE?= =?UTF-8?q?=D0=BD=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=20=D0=BF=D1=80=D0=BE=D1=81=D0=BC=D0=BE=D1=82=D1=80?= =?UTF-8?q?=D0=B5=20=D0=B2=D0=B5=D1=89=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/shareIt.mv.db | Bin 65536 -> 65536 bytes .../shareit/booking/dto/BookingDto.java | 7 ----- .../booking/dto/mapper/BookingMapper.java | 8 +++++ .../dto/mapper/SimplifiedBookingDto.java | 11 +++++++ .../booking/repository/BookingRepository.java | 6 ++++ .../item/controller/ItemController.java | 3 +- .../shareit/item/dto/ItemBookingDto.java | 16 ++++++++++ .../shareit/item/dto/mapper/ItemMapper.java | 19 ++++++------ .../item/repository/ItemRepository.java | 7 ++--- .../shareit/item/service/ItemService.java | 3 +- .../shareit/item/service/ItemServiceImpl.java | 29 +++++++++++++++--- 11 files changed, 82 insertions(+), 27 deletions(-) delete mode 100644 src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java create mode 100644 src/main/java/ru/practicum/shareit/booking/dto/mapper/SimplifiedBookingDto.java create mode 100644 src/main/java/ru/practicum/shareit/item/dto/ItemBookingDto.java diff --git a/db/shareIt.mv.db b/db/shareIt.mv.db index cd4f35e1545e7480bbf0bd7ceae3d5e0fa34eb62..72acf6d022358e8a8a024e2033952dfa24990d00 100644 GIT binary patch literal 65536 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 F{y#X$!BhYM literal 65536 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 IsFf@KA6t73X#fBK diff --git a/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java b/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java deleted file mode 100644 index 861de9e..0000000 --- a/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java +++ /dev/null @@ -1,7 +0,0 @@ -package ru.practicum.shareit.booking.dto; - -/** - * TODO Sprint add-bookings. - */ -public class BookingDto { -} diff --git a/src/main/java/ru/practicum/shareit/booking/dto/mapper/BookingMapper.java b/src/main/java/ru/practicum/shareit/booking/dto/mapper/BookingMapper.java index b5c5d12..140e9ac 100644 --- a/src/main/java/ru/practicum/shareit/booking/dto/mapper/BookingMapper.java +++ b/src/main/java/ru/practicum/shareit/booking/dto/mapper/BookingMapper.java @@ -45,4 +45,12 @@ public static Booking toBooking(BookingRequestDto bookingRequestDto, Item item, status ); } + + public static SimplifiedBookingDto toSimplifiedBookingDto(Booking booking) { + if (booking == null) return null; + return new SimplifiedBookingDto( + booking.getId(), + booking.getBooker().getId() + ); + } } diff --git a/src/main/java/ru/practicum/shareit/booking/dto/mapper/SimplifiedBookingDto.java b/src/main/java/ru/practicum/shareit/booking/dto/mapper/SimplifiedBookingDto.java new file mode 100644 index 0000000..fbdc3fc --- /dev/null +++ b/src/main/java/ru/practicum/shareit/booking/dto/mapper/SimplifiedBookingDto.java @@ -0,0 +1,11 @@ +package ru.practicum.shareit.booking.dto.mapper; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@AllArgsConstructor +@Data +public class SimplifiedBookingDto { + private Long id; + private Long bookerId; +} diff --git a/src/main/java/ru/practicum/shareit/booking/repository/BookingRepository.java b/src/main/java/ru/practicum/shareit/booking/repository/BookingRepository.java index 4b8580f..d2636c3 100644 --- a/src/main/java/ru/practicum/shareit/booking/repository/BookingRepository.java +++ b/src/main/java/ru/practicum/shareit/booking/repository/BookingRepository.java @@ -36,4 +36,10 @@ public interface BookingRepository extends JpaRepository { @Query("SELECT b FROM Booking AS b WHERE b.item.owner = :owner ORDER BY b.start DESC") List findByItemOwnerOrderByStartDesc(@Param("owner") User owner); + + @Query("SELECT b FROM Booking AS b WHERE b.item.id = :itemId AND b.end < CURRENT_TIMESTAMP ORDER BY b.end DESC") + List findLastBooking(@Param("itemId") Long itemId); + + @Query("SELECT b FROM Booking AS b WHERE b.item.id = :itemId AND b.start > CURRENT_TIMESTAMP ORDER BY b.start ASC") + List findNextBooking(@Param("itemId") Long itemId); } diff --git a/src/main/java/ru/practicum/shareit/item/controller/ItemController.java b/src/main/java/ru/practicum/shareit/item/controller/ItemController.java index 1f86c0f..ad063e6 100644 --- a/src/main/java/ru/practicum/shareit/item/controller/ItemController.java +++ b/src/main/java/ru/practicum/shareit/item/controller/ItemController.java @@ -4,6 +4,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import ru.practicum.shareit.item.dto.ItemBookingDto; import ru.practicum.shareit.item.dto.ItemDto; import ru.practicum.shareit.item.service.ItemService; @@ -35,7 +36,7 @@ public ItemDto findItemById(@PathVariable("itemId") Long itemId) { } @GetMapping - public List findUserItems(@RequestHeader("X-Sharer-User-Id") Long userId) { + public List findUserItems(@RequestHeader("X-Sharer-User-Id") Long userId) { log.info("GET /items"); return itemService.findUserItems(userId); } diff --git a/src/main/java/ru/practicum/shareit/item/dto/ItemBookingDto.java b/src/main/java/ru/practicum/shareit/item/dto/ItemBookingDto.java new file mode 100644 index 0000000..7a68b7f --- /dev/null +++ b/src/main/java/ru/practicum/shareit/item/dto/ItemBookingDto.java @@ -0,0 +1,16 @@ +package ru.practicum.shareit.item.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import ru.practicum.shareit.booking.dto.mapper.SimplifiedBookingDto; + +@AllArgsConstructor +@Data +public class ItemBookingDto { + private Long id; + private String name; + private String description; + private Boolean available; + private SimplifiedBookingDto lastBooking; + private SimplifiedBookingDto nextBooking; +} diff --git a/src/main/java/ru/practicum/shareit/item/dto/mapper/ItemMapper.java b/src/main/java/ru/practicum/shareit/item/dto/mapper/ItemMapper.java index cb9aacb..b8722c4 100644 --- a/src/main/java/ru/practicum/shareit/item/dto/mapper/ItemMapper.java +++ b/src/main/java/ru/practicum/shareit/item/dto/mapper/ItemMapper.java @@ -1,6 +1,8 @@ package ru.practicum.shareit.item.dto.mapper; import lombok.experimental.UtilityClass; +import ru.practicum.shareit.booking.dto.mapper.SimplifiedBookingDto; +import ru.practicum.shareit.item.dto.ItemBookingDto; import ru.practicum.shareit.item.dto.ItemDto; import ru.practicum.shareit.item.model.Item; import ru.practicum.shareit.user.model.User; @@ -23,18 +25,17 @@ public static Item toItem(User user, ItemDto itemDto) { itemDto.getDescription(), itemDto.getAvailable(), user - //null ); } - public static Item toItem(Long id, User user, ItemDto itemDto) { - return new Item( - id, - itemDto.getName(), - itemDto.getDescription(), - itemDto.getAvailable(), - user - //null + public static ItemBookingDto toItemBookingDto(Item item, SimplifiedBookingDto lastBooking, SimplifiedBookingDto nextBooking) { + return new ItemBookingDto( + item.getId(), + item.getName(), + item.getDescription(), + item.getAvailable(), + lastBooking, + nextBooking ); } } diff --git a/src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java b/src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java index 1a910af..b71ebeb 100644 --- a/src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java +++ b/src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java @@ -2,7 +2,6 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; import ru.practicum.shareit.item.model.Item; import ru.practicum.shareit.user.model.User; @@ -11,8 +10,8 @@ public interface ItemRepository extends JpaRepository { List findAllByOwner(User user); - @Query("select i from Item i " + - "where upper(i.name) like upper(concat('%', ?1, '%')) " + - " or upper(i.description) like upper(concat('%', ?1, '%'))") + @Query("SELECT i FROM Item i " + + "WHERE UPPER(i.name) LIKE UPPER(CONCAT('%', ?1, '%')) " + + " OR UPPER(i.description) LIKE UPPER(CONCAT('%', ?1, '%'))") List search(String text); } diff --git a/src/main/java/ru/practicum/shareit/item/service/ItemService.java b/src/main/java/ru/practicum/shareit/item/service/ItemService.java index bcc43e4..ad415bf 100644 --- a/src/main/java/ru/practicum/shareit/item/service/ItemService.java +++ b/src/main/java/ru/practicum/shareit/item/service/ItemService.java @@ -1,5 +1,6 @@ package ru.practicum.shareit.item.service; +import ru.practicum.shareit.item.dto.ItemBookingDto; import ru.practicum.shareit.item.dto.ItemDto; import java.util.List; @@ -11,7 +12,7 @@ public interface ItemService { ItemDto findItemById(Long itemId); - List findUserItems(Long userId); + List findUserItems(Long userId); List searchItem(String text); } diff --git a/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java b/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java index d933101..2073aae 100644 --- a/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java +++ b/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java @@ -3,8 +3,12 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import ru.practicum.shareit.booking.dto.mapper.BookingMapper; +import ru.practicum.shareit.booking.model.Booking; +import ru.practicum.shareit.booking.repository.BookingRepository; import ru.practicum.shareit.exception.NotFoundException; import ru.practicum.shareit.exception.ValidationException; +import ru.practicum.shareit.item.dto.ItemBookingDto; import ru.practicum.shareit.item.repository.ItemRepository; import ru.practicum.shareit.item.dto.ItemDto; import ru.practicum.shareit.item.dto.mapper.ItemMapper; @@ -24,6 +28,7 @@ public class ItemServiceImpl implements ItemService { private final ItemRepository itemRepository; private final UserRepository userRepository; + private final BookingRepository bookingRepository; @Override public ItemDto createItem(Long userId, ItemDto itemDto) { @@ -65,11 +70,25 @@ public ItemDto findItemById(Long itemId) { } @Override - public List findUserItems(Long userId) { - User user = validateUser(userId); - return itemRepository.findAllByOwner(user).stream() - .filter(item -> Objects.equals(item.getOwner().getId(), userId)) - .map(ItemMapper::toItemDto) + public List findUserItems(Long userId) { + User owner = validateUser(userId); + List items = itemRepository.findAllByOwner(owner); + + return items.stream() + .map(item -> { + Booking lastBooking = bookingRepository.findLastBooking(item.getId()).stream() + .findFirst() + .orElse(null); + Booking nextBooking = bookingRepository.findNextBooking(item.getId()).stream() + .findFirst() + .orElse(null); + + return ItemMapper.toItemBookingDto( + item, + BookingMapper.toSimplifiedBookingDto(lastBooking), + BookingMapper.toSimplifiedBookingDto(nextBooking) + ); + }) .collect(Collectors.toList()); } From 6a36ff78764e938fa9070836a0d29738af5bcc47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9?= Date: Thu, 3 Jul 2025 17:30:19 +0300 Subject: [PATCH 06/25] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BE=D1=82=D0=B7=D1=8B=D0=B2=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/shareIt.mv.db | Bin 65536 -> 73728 bytes db/shareIt.trace.db | 958 ++++++++++++++++++ pom.xml | 486 +++++---- .../{mapper => }/SimplifiedBookingDto.java | 2 +- .../booking/dto/mapper/BookingMapper.java | 1 + .../booking/repository/BookingRepository.java | 3 + .../booking/service/BookingService.java | 1 - .../item/comment/dto/CommentRequestDto.java | 14 + .../item/comment/dto/CommentResponseDto.java | 17 + .../comment/dto/mapper/CommentMapper.java | 32 + .../shareit/item/comment/model/Comment.java | 29 + .../comment/repository/CommentRepository.java | 10 + .../item/controller/ItemController.java | 14 +- .../shareit/item/dto/ItemBookingDto.java | 8 +- .../shareit/item/dto/mapper/ItemMapper.java | 13 +- .../ru/practicum/shareit/item/model/Item.java | 2 - .../shareit/item/service/ItemService.java | 6 +- .../shareit/item/service/ItemServiceImpl.java | 67 +- .../shareit/user/dto/mapper/UserMapper.java | 8 - src/main/resources/application.properties | 2 + src/main/resources/schema.sql | 3 +- 21 files changed, 1391 insertions(+), 285 deletions(-) rename src/main/java/ru/practicum/shareit/booking/dto/{mapper => }/SimplifiedBookingDto.java (77%) create mode 100644 src/main/java/ru/practicum/shareit/item/comment/dto/CommentRequestDto.java create mode 100644 src/main/java/ru/practicum/shareit/item/comment/dto/CommentResponseDto.java create mode 100644 src/main/java/ru/practicum/shareit/item/comment/dto/mapper/CommentMapper.java create mode 100644 src/main/java/ru/practicum/shareit/item/comment/model/Comment.java create mode 100644 src/main/java/ru/practicum/shareit/item/comment/repository/CommentRepository.java diff --git a/db/shareIt.mv.db b/db/shareIt.mv.db index 72acf6d022358e8a8a024e2033952dfa24990d00..a42e9753d03d9ccd05a1f6a66d593af56af73edb 100644 GIT binary patch literal 73728 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 - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.3.2 + + - ru.practicum - shareit - 0.0.1-SNAPSHOT + ru.practicum + shareit + 0.0.1-SNAPSHOT - ShareIt + ShareIt - - 21 - + + 21 + - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-configuration-processor - true - + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-configuration-processor + true + - - org.postgresql - postgresql - runtime - + + org.postgresql + postgresql + runtime + - - org.projectlombok - lombok - true - + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.h2database + h2 + + - - com.h2database - h2 - test - - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework.boot - spring-boot-starter-validation - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.postgresql - postgresql - - - com.h2database - h2 - - - - - - - src/main/resources - true - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - - test - - - - - org.apache.maven.plugins - maven-checkstyle-plugin - 3.1.2 - - checkstyle.xml - true - true - true - - - - - check - - compile - - - - - com.puppycrawl.tools - checkstyle - 10.3 - - - - - com.github.spotbugs - spotbugs-maven-plugin - 4.8.5.0 - - Max - High - - - - - check - - - - - - org.jacoco - jacoco-maven-plugin - 0.8.12 - - file - - - - jacoco-initialize - - prepare-agent - - - - jacoco-check - - check - - - - - BUNDLE - - - INSTRUCTION - COVEREDRATIO - 0.01 - - - LINE - COVEREDRATIO - 0.9 - - - BRANCH - COVEREDRATIO - 0.6 - - - COMPLEXITY - COVEREDRATIO - 0.6 - - - METHOD - COVEREDRATIO - 0.7 - - - CLASS - MISSEDCOUNT - 1 - - - - - - - - jacoco-report - test - - report - - - - - - - - - - check - - - - org.apache.maven.plugins - maven-checkstyle-plugin - - - com.github.spotbugs - spotbugs-maven-plugin - - - - - - - com.github.spotbugs - spotbugs-maven-plugin - - - - - - coverage - - - - org.jacoco - jacoco-maven-plugin - - - - - + + + + src/main/resources + true + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + test + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + 3.1.2 + + checkstyle.xml + true + true + true + + + + + check + + compile + + + + + com.puppycrawl.tools + checkstyle + 10.3 + + + + + com.github.spotbugs + spotbugs-maven-plugin + 4.8.5.0 + + Max + High + + + + + check + + + + + + org.jacoco + jacoco-maven-plugin + 0.8.12 + + file + + + + jacoco-initialize + + prepare-agent + + + + jacoco-check + + check + + + + + BUNDLE + + + INSTRUCTION + COVEREDRATIO + 0.01 + + + LINE + COVEREDRATIO + 0.9 + + + BRANCH + COVEREDRATIO + 0.6 + + + COMPLEXITY + COVEREDRATIO + 0.6 + + + METHOD + COVEREDRATIO + 0.7 + + + CLASS + MISSEDCOUNT + 1 + + + + + + + + jacoco-report + test + + report + + + + + + + + + + check + + + + org.apache.maven.plugins + maven-checkstyle-plugin + + + com.github.spotbugs + spotbugs-maven-plugin + + + + + + + com.github.spotbugs + spotbugs-maven-plugin + + + + + + coverage + + + + org.jacoco + jacoco-maven-plugin + + + + + diff --git a/src/main/java/ru/practicum/shareit/booking/dto/mapper/SimplifiedBookingDto.java b/src/main/java/ru/practicum/shareit/booking/dto/SimplifiedBookingDto.java similarity index 77% rename from src/main/java/ru/practicum/shareit/booking/dto/mapper/SimplifiedBookingDto.java rename to src/main/java/ru/practicum/shareit/booking/dto/SimplifiedBookingDto.java index fbdc3fc..e38fd4e 100644 --- a/src/main/java/ru/practicum/shareit/booking/dto/mapper/SimplifiedBookingDto.java +++ b/src/main/java/ru/practicum/shareit/booking/dto/SimplifiedBookingDto.java @@ -1,4 +1,4 @@ -package ru.practicum.shareit.booking.dto.mapper; +package ru.practicum.shareit.booking.dto; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/ru/practicum/shareit/booking/dto/mapper/BookingMapper.java b/src/main/java/ru/practicum/shareit/booking/dto/mapper/BookingMapper.java index 140e9ac..e015d27 100644 --- a/src/main/java/ru/practicum/shareit/booking/dto/mapper/BookingMapper.java +++ b/src/main/java/ru/practicum/shareit/booking/dto/mapper/BookingMapper.java @@ -3,6 +3,7 @@ import lombok.experimental.UtilityClass; import ru.practicum.shareit.booking.dto.BookingRequestDto; import ru.practicum.shareit.booking.dto.BookingResponseDto; +import ru.practicum.shareit.booking.dto.SimplifiedBookingDto; import ru.practicum.shareit.booking.model.Booking; import ru.practicum.shareit.booking.status.RentalStatus; import ru.practicum.shareit.item.dto.ItemDto; diff --git a/src/main/java/ru/practicum/shareit/booking/repository/BookingRepository.java b/src/main/java/ru/practicum/shareit/booking/repository/BookingRepository.java index d2636c3..43ba909 100644 --- a/src/main/java/ru/practicum/shareit/booking/repository/BookingRepository.java +++ b/src/main/java/ru/practicum/shareit/booking/repository/BookingRepository.java @@ -7,6 +7,7 @@ import ru.practicum.shareit.booking.status.RentalStatus; import ru.practicum.shareit.user.model.User; +import java.time.LocalDateTime; import java.util.List; public interface BookingRepository extends JpaRepository { @@ -42,4 +43,6 @@ public interface BookingRepository extends JpaRepository { @Query("SELECT b FROM Booking AS b WHERE b.item.id = :itemId AND b.start > CURRENT_TIMESTAMP ORDER BY b.start ASC") List findNextBooking(@Param("itemId") Long itemId); + + Booking findFirstByBookerIdAndItemIdAndEndIsBeforeOrderByEndDesc(Long bookerId, Long itemId, LocalDateTime end); } diff --git a/src/main/java/ru/practicum/shareit/booking/service/BookingService.java b/src/main/java/ru/practicum/shareit/booking/service/BookingService.java index a1c582c..9fb6c87 100644 --- a/src/main/java/ru/practicum/shareit/booking/service/BookingService.java +++ b/src/main/java/ru/practicum/shareit/booking/service/BookingService.java @@ -1,6 +1,5 @@ package ru.practicum.shareit.booking.service; - import ru.practicum.shareit.booking.dto.BookingRequestDto; import ru.practicum.shareit.booking.dto.BookingResponseDto; diff --git a/src/main/java/ru/practicum/shareit/item/comment/dto/CommentRequestDto.java b/src/main/java/ru/practicum/shareit/item/comment/dto/CommentRequestDto.java new file mode 100644 index 0000000..031ec2e --- /dev/null +++ b/src/main/java/ru/practicum/shareit/item/comment/dto/CommentRequestDto.java @@ -0,0 +1,14 @@ +package ru.practicum.shareit.item.comment.dto; + +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +public class CommentRequestDto { + @NotBlank(message = "Комментарий не может быть пустым") + private String text; +} diff --git a/src/main/java/ru/practicum/shareit/item/comment/dto/CommentResponseDto.java b/src/main/java/ru/practicum/shareit/item/comment/dto/CommentResponseDto.java new file mode 100644 index 0000000..210227e --- /dev/null +++ b/src/main/java/ru/practicum/shareit/item/comment/dto/CommentResponseDto.java @@ -0,0 +1,17 @@ +package ru.practicum.shareit.item.comment.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.time.LocalDateTime; + +@AllArgsConstructor +@Data +public class CommentResponseDto { + private Long id; + private String text; + private String authorName; + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") + private LocalDateTime created; +} diff --git a/src/main/java/ru/practicum/shareit/item/comment/dto/mapper/CommentMapper.java b/src/main/java/ru/practicum/shareit/item/comment/dto/mapper/CommentMapper.java new file mode 100644 index 0000000..2a350f4 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/item/comment/dto/mapper/CommentMapper.java @@ -0,0 +1,32 @@ +package ru.practicum.shareit.item.comment.dto.mapper; + +import lombok.experimental.UtilityClass; +import ru.practicum.shareit.item.comment.dto.CommentRequestDto; +import ru.practicum.shareit.item.comment.dto.CommentResponseDto; +import ru.practicum.shareit.item.comment.model.Comment; +import ru.practicum.shareit.item.model.Item; +import ru.practicum.shareit.user.model.User; + +import java.time.LocalDateTime; + +@UtilityClass +public class CommentMapper { + public static CommentResponseDto toCommentResponseDto(Comment comment) { + return new CommentResponseDto( + comment.getId(), + comment.getText(), + comment.getAuthor().getName(), + comment.getCreated() + ); + } + + public static Comment toComment(CommentRequestDto commentRequestDto, User author, Item item) { + return new Comment( + null, + commentRequestDto.getText(), + item, + author, + LocalDateTime.now() + ); + } +} diff --git a/src/main/java/ru/practicum/shareit/item/comment/model/Comment.java b/src/main/java/ru/practicum/shareit/item/comment/model/Comment.java new file mode 100644 index 0000000..6fe014f --- /dev/null +++ b/src/main/java/ru/practicum/shareit/item/comment/model/Comment.java @@ -0,0 +1,29 @@ +package ru.practicum.shareit.item.comment.model; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import ru.practicum.shareit.item.model.Item; +import ru.practicum.shareit.user.model.User; + +import java.time.LocalDateTime; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Entity +@Table(name = "comments") +public class Comment { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String text; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "item_id", nullable = false) + private Item item; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "author_id", nullable = false) + private User author; + private LocalDateTime created; +} diff --git a/src/main/java/ru/practicum/shareit/item/comment/repository/CommentRepository.java b/src/main/java/ru/practicum/shareit/item/comment/repository/CommentRepository.java new file mode 100644 index 0000000..4d86854 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/item/comment/repository/CommentRepository.java @@ -0,0 +1,10 @@ +package ru.practicum.shareit.item.comment.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import ru.practicum.shareit.item.comment.model.Comment; + +import java.util.List; + +public interface CommentRepository extends JpaRepository { + List findByItemId(Long getId); +} diff --git a/src/main/java/ru/practicum/shareit/item/controller/ItemController.java b/src/main/java/ru/practicum/shareit/item/controller/ItemController.java index ad063e6..a0293d0 100644 --- a/src/main/java/ru/practicum/shareit/item/controller/ItemController.java +++ b/src/main/java/ru/practicum/shareit/item/controller/ItemController.java @@ -4,6 +4,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import ru.practicum.shareit.item.comment.dto.CommentRequestDto; +import ru.practicum.shareit.item.comment.dto.CommentResponseDto; import ru.practicum.shareit.item.dto.ItemBookingDto; import ru.practicum.shareit.item.dto.ItemDto; import ru.practicum.shareit.item.service.ItemService; @@ -30,9 +32,9 @@ public ItemDto updateItem(@RequestHeader("X-Sharer-User-Id") Long userId, @PathV } @GetMapping("/{itemId}") - public ItemDto findItemById(@PathVariable("itemId") Long itemId) { + public ItemBookingDto findItemById(@RequestHeader("X-Sharer-User-Id") Long userId, @PathVariable("itemId") Long itemId) { log.info("GET /items/{}", itemId); - return itemService.findItemById(itemId); + return itemService.findItemById(userId, itemId); } @GetMapping @@ -46,4 +48,12 @@ public List searchItem(@RequestParam(name = "text") String text) { log.info("GET /items/search?text={}.", text); return itemService.searchItem(text); } + + @PostMapping("/{itemId}/comment") + public CommentResponseDto createComment(@RequestHeader("X-Sharer-User-Id") Long userId, + @PathVariable("itemId") Long itemId, + @Valid @RequestBody CommentRequestDto commentRequestDto) { + log.info("POST /items/{}/comment", itemId); + return itemService.createComment(userId, itemId, commentRequestDto); + } } diff --git a/src/main/java/ru/practicum/shareit/item/dto/ItemBookingDto.java b/src/main/java/ru/practicum/shareit/item/dto/ItemBookingDto.java index 7a68b7f..c57e5c5 100644 --- a/src/main/java/ru/practicum/shareit/item/dto/ItemBookingDto.java +++ b/src/main/java/ru/practicum/shareit/item/dto/ItemBookingDto.java @@ -2,8 +2,13 @@ import lombok.AllArgsConstructor; import lombok.Data; -import ru.practicum.shareit.booking.dto.mapper.SimplifiedBookingDto; +import lombok.NoArgsConstructor; +import ru.practicum.shareit.booking.dto.SimplifiedBookingDto; +import ru.practicum.shareit.item.comment.dto.CommentResponseDto; +import java.util.List; + +@NoArgsConstructor @AllArgsConstructor @Data public class ItemBookingDto { @@ -13,4 +18,5 @@ public class ItemBookingDto { private Boolean available; private SimplifiedBookingDto lastBooking; private SimplifiedBookingDto nextBooking; + private List comments; } diff --git a/src/main/java/ru/practicum/shareit/item/dto/mapper/ItemMapper.java b/src/main/java/ru/practicum/shareit/item/dto/mapper/ItemMapper.java index b8722c4..72cbccd 100644 --- a/src/main/java/ru/practicum/shareit/item/dto/mapper/ItemMapper.java +++ b/src/main/java/ru/practicum/shareit/item/dto/mapper/ItemMapper.java @@ -1,12 +1,15 @@ package ru.practicum.shareit.item.dto.mapper; import lombok.experimental.UtilityClass; -import ru.practicum.shareit.booking.dto.mapper.SimplifiedBookingDto; +import ru.practicum.shareit.booking.dto.SimplifiedBookingDto; +import ru.practicum.shareit.item.comment.dto.CommentResponseDto; import ru.practicum.shareit.item.dto.ItemBookingDto; import ru.practicum.shareit.item.dto.ItemDto; import ru.practicum.shareit.item.model.Item; import ru.practicum.shareit.user.model.User; +import java.util.List; + @UtilityClass public class ItemMapper { public static ItemDto toItemDto(Item item) { @@ -28,14 +31,18 @@ public static Item toItem(User user, ItemDto itemDto) { ); } - public static ItemBookingDto toItemBookingDto(Item item, SimplifiedBookingDto lastBooking, SimplifiedBookingDto nextBooking) { + public static ItemBookingDto toItemBookingDto(Item item, + SimplifiedBookingDto lastBooking, + SimplifiedBookingDto nextBooking, + List comments) { return new ItemBookingDto( item.getId(), item.getName(), item.getDescription(), item.getAvailable(), lastBooking, - nextBooking + nextBooking, + comments ); } } diff --git a/src/main/java/ru/practicum/shareit/item/model/Item.java b/src/main/java/ru/practicum/shareit/item/model/Item.java index 67b2b97..1887115 100644 --- a/src/main/java/ru/practicum/shareit/item/model/Item.java +++ b/src/main/java/ru/practicum/shareit/item/model/Item.java @@ -4,7 +4,6 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import ru.practicum.shareit.request.ItemRequest; import ru.practicum.shareit.user.model.User; @NoArgsConstructor @@ -22,5 +21,4 @@ public class Item { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "owner_id") private User owner; - //private ItemRequest request; } diff --git a/src/main/java/ru/practicum/shareit/item/service/ItemService.java b/src/main/java/ru/practicum/shareit/item/service/ItemService.java index ad415bf..9a23864 100644 --- a/src/main/java/ru/practicum/shareit/item/service/ItemService.java +++ b/src/main/java/ru/practicum/shareit/item/service/ItemService.java @@ -1,5 +1,7 @@ package ru.practicum.shareit.item.service; +import ru.practicum.shareit.item.comment.dto.CommentRequestDto; +import ru.practicum.shareit.item.comment.dto.CommentResponseDto; import ru.practicum.shareit.item.dto.ItemBookingDto; import ru.practicum.shareit.item.dto.ItemDto; @@ -10,9 +12,11 @@ public interface ItemService { ItemDto updateItem(Long itemId, Long userId, ItemDto itemDto); - ItemDto findItemById(Long itemId); + ItemBookingDto findItemById(Long userId, Long itemId); List findUserItems(Long userId); List searchItem(String text); + + CommentResponseDto createComment(Long userId, Long itemId, CommentRequestDto commentRequestDto); } diff --git a/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java b/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java index 2073aae..c27bfa4 100644 --- a/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java +++ b/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java @@ -8,6 +8,10 @@ import ru.practicum.shareit.booking.repository.BookingRepository; import ru.practicum.shareit.exception.NotFoundException; import ru.practicum.shareit.exception.ValidationException; +import ru.practicum.shareit.item.comment.dto.CommentRequestDto; +import ru.practicum.shareit.item.comment.dto.CommentResponseDto; +import ru.practicum.shareit.item.comment.dto.mapper.CommentMapper; +import ru.practicum.shareit.item.comment.repository.CommentRepository; import ru.practicum.shareit.item.dto.ItemBookingDto; import ru.practicum.shareit.item.repository.ItemRepository; import ru.practicum.shareit.item.dto.ItemDto; @@ -16,6 +20,7 @@ import ru.practicum.shareit.user.model.User; import ru.practicum.shareit.user.repository.UserRepository; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -29,6 +34,7 @@ public class ItemServiceImpl implements ItemService { private final ItemRepository itemRepository; private final UserRepository userRepository; private final BookingRepository bookingRepository; + private final CommentRepository commentRepository; @Override public ItemDto createItem(Long userId, ItemDto itemDto) { @@ -64,9 +70,10 @@ public ItemDto updateItem(Long itemId, Long userId, ItemDto itemDto) { } @Override - public ItemDto findItemById(Long itemId) { + public ItemBookingDto findItemById(Long userId, Long itemId) { Item item = validateItem(itemId); - return ItemMapper.toItemDto(item); + + return forBookingDtoProduct(item, userId); } @Override @@ -75,20 +82,7 @@ public List findUserItems(Long userId) { List items = itemRepository.findAllByOwner(owner); return items.stream() - .map(item -> { - Booking lastBooking = bookingRepository.findLastBooking(item.getId()).stream() - .findFirst() - .orElse(null); - Booking nextBooking = bookingRepository.findNextBooking(item.getId()).stream() - .findFirst() - .orElse(null); - - return ItemMapper.toItemBookingDto( - item, - BookingMapper.toSimplifiedBookingDto(lastBooking), - BookingMapper.toSimplifiedBookingDto(nextBooking) - ); - }) + .map(item -> forBookingDtoProduct(item, userId)) .collect(Collectors.toList()); } @@ -104,6 +98,22 @@ public List searchItem(String text) { .collect(Collectors.toList()); } + @Override + public CommentResponseDto createComment(Long userId, Long itemId, CommentRequestDto commentRequestDto) { + User author = validateUser(userId); + Item item = validateItem(itemId); + + Booking booking = bookingRepository.findFirstByBookerIdAndItemIdAndEndIsBeforeOrderByEndDesc(userId, itemId, LocalDateTime.now()); + + if (booking == null) { + log.warn("Пользователь может оставить комментарий после аренды"); + throw new ValidationException("Пользователь может оставить комментарий после аренды"); + } + + return CommentMapper.toCommentResponseDto(commentRepository.save(CommentMapper.toComment(commentRequestDto, author, item))); + } + + private User validateUser(Long userId) { return userRepository.findById(userId) .orElseThrow(() -> new NotFoundException("Пользователь с данным id: " + userId + " не найден")); @@ -113,4 +123,29 @@ private Item validateItem(Long itemId) { return itemRepository.findById(itemId) .orElseThrow(() -> new NotFoundException("Элемент с данным id: " + itemId + " не найден")); } + + private ItemBookingDto forBookingDtoProduct(Item item, Long userId) { + List comments = commentRepository.findByItemId(item.getId()).stream() + .map(CommentMapper::toCommentResponseDto) + .collect(Collectors.toList()); + + if (!Objects.equals(item.getOwner().getId(), (userId))) { + return ItemMapper.toItemBookingDto(item, null, null, comments); + } + + Booking lastBooking = bookingRepository.findLastBooking(item.getId()).stream() + .findFirst() + .orElse(null); + + Booking nextBooking = bookingRepository.findNextBooking(item.getId()).stream() + .findFirst() + .orElse(null); + + return ItemMapper.toItemBookingDto( + item, + BookingMapper.toSimplifiedBookingDto(lastBooking), + BookingMapper.toSimplifiedBookingDto(nextBooking), + comments + ); + } } diff --git a/src/main/java/ru/practicum/shareit/user/dto/mapper/UserMapper.java b/src/main/java/ru/practicum/shareit/user/dto/mapper/UserMapper.java index bf99f95..e357d95 100644 --- a/src/main/java/ru/practicum/shareit/user/dto/mapper/UserMapper.java +++ b/src/main/java/ru/practicum/shareit/user/dto/mapper/UserMapper.java @@ -21,12 +21,4 @@ public static User toUser(UserDto userDto) { userDto.getEmail() ); } - - public static User toUser(Long id, UserDto userDto) { - return new User( - id, - userDto.getName(), - userDto.getEmail() - ); - } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8247864..1cafcd1 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -10,6 +10,8 @@ logging.level.org.springframework.transaction=INFO logging.level.org.springframework.transaction.interceptor=TRACE logging.level.org.springframework.orm.jpa.JpaTransactionManager=DEBUG +logging.level.ru.practicum.shareit=INFO + # TODO Append connection to DB spring.datasource.driverClassName=org.h2.Driver spring.datasource.url=jdbc:h2:file:./db/shareIt diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 3b6c92f..da83833 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -18,10 +18,8 @@ CREATE TABLE IF NOT EXISTS items ( description VARCHAR(2000), available BOOLEAN DEFAULT TRUE, owner_id BIGINT NOT NULL, - --request_id BIGINT, CONSTRAINT pk_item PRIMARY KEY (id), CONSTRAINT fk_item_owner FOREIGN KEY (owner_id) REFERENCES users(id) - --CONSTRAINT fk_item_request FOREIGN KEY (request_id) REFERENCES item_requests(id) ); CREATE TABLE IF NOT EXISTS bookings ( @@ -49,6 +47,7 @@ CREATE TABLE IF NOT EXISTS comments ( text VARCHAR(2000), item_id BIGINT NOT NULL, author_id BIGINT NOT NULL, + created TIMESTAMP WITHOUT TIME ZONE NOT NULL, CONSTRAINT pk_comment PRIMARY KEY (id), CONSTRAINT fk_cooment_item FOREIGN KEY (item_id) REFERENCES items(id), CONSTRAINT fk_cooment_author FOREIGN KEY (author_id) REFERENCES users(id) From f083944e13850e3eb308f612cb8004e2bebe3212 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9?= Date: Fri, 4 Jul 2025 00:20:07 +0300 Subject: [PATCH 07/25] =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20shareIt.mv.db=20=D0=B8=20shareIt.trace.db?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/shareIt.mv.db | Bin 73728 -> 0 bytes db/shareIt.trace.db | 3113 ------------------------------------------- 2 files changed, 3113 deletions(-) delete mode 100644 db/shareIt.mv.db delete mode 100644 db/shareIt.trace.db diff --git a/db/shareIt.mv.db b/db/shareIt.mv.db deleted file mode 100644 index a42e9753d03d9ccd05a1f6a66d593af56af73edb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73728 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