【问题标题】:Insert single record in mapping table in spring boot rest在spring boot rest的映射表中插入单条记录
【发布时间】:2022-01-28 08:18:21
【问题描述】:

在我的项目中,两个类 Book 和 Story 作为 OneToMany 关系我只想在 Story 类中插入记录我有这个逻辑

//service class
  public Story saveStoryBook(int id, Story story) {
        Story stry=new Story();
        stry.setStoryName(story.getStoryName());
        Book book= bookRepository.findById(id).get();
log.info(book);
        book.addStory(stry);

        stry.setBook(book);
        log.info(stry);
        Story s= storyRepository.save(stry);
        log.info(s);
        return s;
    }

然后使用邮递员运行此代码,我收到 500 错误并在命令提示符中显示

2021-12-30 10:19:05 - Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-12-30 10:19:05 - Initializing Servlet 'dispatcherServlet'
2021-12-30 10:19:05 - Detected StandardServletMultipartResolver
2021-12-30 10:19:05 - Detected AcceptHeaderLocaleResolver
2021-12-30 10:19:05 - Detected FixedThemeResolver
2021-12-30 10:19:05 - Detected org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator@25110bb9
2021-12-30 10:19:05 - Detected org.springframework.web.servlet.support.SessionFlashMapManager@7d49a1a0
2021-12-30 10:19:05 - enableLoggingRequestDetails='false': request parameters and headers will be masked to prevent unsafe logging of potentially sensitive data
2021-12-30 10:19:05 - Completed initialization in 2 ms
2021-12-30 10:19:05 - POST "/story/save/1", parameters={}
2021-12-30 10:19:05 - Mapped to in.techSoft.OTM.Controller.StoryController#saveStory(int, Story)
2021-12-30 10:19:05 - Opening JPA EntityManager in OpenEntityManagerInViewInterceptor
2021-12-30 10:19:05 - Read "application/json;charset=UTF-8" to [Story(storyId=0, storyName=Collection, book=null)]
2021-12-30 10:19:05 - Found thread-bound EntityManager [SessionImpl(1720633741<open>)] for JPA transaction
2021-12-30 10:19:05 - Creating new transaction with name [org.springframework.data.jpa.repository.support.SimpleJpaRepository.findById]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly
2021-12-30 10:19:05 - Setting JDBC Connection [HikariProxyConnection@1983273745 wrapping org.postgresql.jdbc.PgConnection@5787763b] read-only
2021-12-30 10:19:05 - Exposing JPA transaction as JDBC [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@6ebe9625]
Hibernate: select book0_.id as id1_0_0_, book0_.book_name as book_nam2_0_0_, storylist1_.bid as bid3_1_1_, storylist1_.story_id as story_id1_1_1_, storylist1_.story_id as story_id1_1_2_, storylist1_.bid as bid3_1_2_, storylist1_.story_name as story_na2_1_2_ from book book0_ left outer join story storylist1_ on book0_.id=storylist1_.bid where book0_.id=?
2021-12-30 10:19:05 - Initiating transaction commit
2021-12-30 10:19:05 - Committing JPA transaction on EntityManager [SessionImpl(1720633741<open>)]
2021-12-30 10:19:05 - Resetting read-only flag of JDBC Connection [HikariProxyConnection@1983273745 wrapping org.postgresql.jdbc.PgConnection@5787763b]
2021-12-30 10:19:05 - Not closing pre-bound JPA EntityManager after transaction
2021-12-30 10:19:05 - Closing JPA EntityManager in OpenEntityManagerInViewInterceptor
2021-12-30 10:19:05 - Failed to complete request: org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.StackOverflowError
2021-12-30 10:19:05 - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.StackOverflowError] with root cause
java.lang.StackOverflowError: null
    at in.techSoft.OTM.Entity.Book.toString(Book.java:12)
    at java.base/java.lang.StringConcatHelper.stringOf(StringConcatHelper.java:453)
    at in.techSoft.OTM.Entity.Story.toString(Story.java:11)
    at java.base/java.lang.String.valueOf(String.java:4215)
    at java.base/java.lang.StringBuilder.append(StringBuilder.java:169)
    at java.base/java.util.AbstractCollection.toString(AbstractCollection.java:457)
    at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:622)
    at java.base/java.lang.StringConcatHelper.stringOf(StringConcatHelper.java:453)
2021-12-30 10:19:05 - "ERROR" dispatch for POST "/error", parameters={}
2021-12-30 10:19:05 - Mapped to org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#error(HttpServletRequest)
2021-12-30 10:19:05 - Opening JPA EntityManager in OpenEntityManagerInViewInterceptor
2021-12-30 10:19:05 - Using 'application/json', given [*/*] and supported [application/json, application/*+json, application/json, application/*+json]
2021-12-30 10:19:05 - Writing [{timestamp=Thu Dec 30 10:19:05 IST 2021, status=500, error=Internal Server Error, path=/story/save/1 (truncated)...]
2021-12-30 10:19:05 - Closing JPA EntityManager in OpenEntityManagerInViewInterceptor
2021-12-30 10:19:05 - Exiting from "ERROR" dispatch, status 500


存储库类 故事库

@Repository
public interface StoryRepository extends JpaRepository<Story, Integer> {

} 

书库

@Repository
public interface BookRepository extends JpaRepository<Book, Integer> {
}

服务接口

@Component
public interface BookService {
    public Book saveBook(Book book);
    public Book findByBookId(int bookId);
    public Story saveStoryBook(int id,Story story);
}

我很难在故事类中插入数据

【问题讨论】:

  • 你能告诉我你的repositorycontroller
  • 更新我的问题
  • 请同时显示 Book.class 源代码。问题出在 toString 方法中。

标签: spring spring-boot hibernate spring-data-jpa


【解决方案1】:

看起来Book.toString 使用Story.toString,后者使用Book.toString。这就是你有 StackOverflowError 的原因。重构 Story.toString 以不使用 Book.toString 但可能只使用 Book id。

【讨论】:

    猜你喜欢
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多