Spring Boot JPA Hibernate一对一关系错误

z0qdvdin  于 2023-03-02  发布在  Spring
关注(0)|答案(2)|浏览(239)

我试图实现一对一关系bw 3实体,但面临这个散列码相关的错误。我有3个类在2类我试图访问一个companyaccessright实体。
公司访问权限-

  1. @Entity
  2. @Table(name = "company_access_rights")
  3. @Data
  4. @EqualsAndHashCode(callSuper = true)
  5. @NoArgsConstructor
  6. public class CompanyAccessRights{
  7. }
  1. @Entity
  2. @Table(name = "companies")
  3. @Data
  4. @EqualsAndHashCode(callSuper = true)
  5. @NoArgsConstructor
  6. public class Company{
  7. @OneToOne
  8. @JoinColumn(name = "company_access_rights")
  9. private CompanyAccessRights companyAccessRights;
  10. }
  1. @Entity
  2. @Table(name = "company_employment_settings")
  3. @Data
  4. @EqualsAndHashCode(callSuper = true)
  5. @NoArgsConstructor
  6. public class CompanyEmploymentSettings{
  7. @OneToOne
  8. @JoinColumn(name = "company_access_rights")
  9. private CompanyAccessRights companyAccessRights;
  10. }
  1. ERROR [28.02.2023 11:12:10,974]: [] [] org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Filter execution threw an exception] with root cause
  2. java.lang.StackOverflowError: null
  3. at ch.talmatch.app.domain.company.Company.hashCode(Company.java:19) ~[classes/:?]
  4. at ch.talmatch.app.domain.company.CompanyEmploymentSettings.hashCode(CompanyEmploymentSettings.java:33) ~[classes/:?]
  5. at ch.talmatch.app.domain.company.Company.hashCode(Company.java:19) ~[classes/:?]
  6. at ch.talmatch.app.domain.company.CompanyEmploymentSettings.hashCode(CompanyEmploymentSettings.java:33) ~[classes/:?]
  7. at ch.talmatch.app.domain.company.Company.hashCode(Company.java:19) ~[classes/:?]
  8. at ch.talmatch.app.domain.company.CompanyEmploymentSettings.hashCode(CompanyEmploymentSettings.java:33) ~[classes/:?]
  9. at ch.talmatch.app.domain.company.Company.hashCode(Company.java:19) ~[classes/:?]
  10. at ch.talmatch.app.domain.company.CompanyEmploymentSettings.hashCode(CompanyEmploymentSettings.java:33) ~[classes/:?]
  11. at ch.talmatch.app.domain.company.Company.hashCode(Company.java:19) ~[classes/:?]
  12. at ch.talmatch.app.domain.company.CompanyEmploymentSettings.hashCode(CompanyEmploymentSettings.java:33) ~[classes/:?]
  13. at ch.talmatch.app.domain.company.Company.hashCode(Company.java:19) ~[classes/:?]
  14. at ch.talmatch.app.domain.company.CompanyEmploymentSettings.hashCode(CompanyEmploymentSettings.java:33) ~[classes/:?]
  15. at ch.talmatch.app.domain.company.Company.hashCode(Company.java:19) ~[classes/:?]
  16. at ch.talmatch.app.domain.company.CompanyEmploymentSettings.hashCode(CompanyEmploymentSettings.java:33) ~[classes/:?]
  17. at ch.talmatch.app.domain.company.Company.hashCode(Company.java:19) ~[classes/:?]
  18. at ch.talmatch.app.domain.company.CompanyEmploymentSettings.hashCode(CompanyEmploymentSettings.java:33) ~[classes/:?]
  19. at ch.talmatch.app.domain.company.Company.hashCode(Company.java:19) ~[classes/:?]
  20. at ch.talmatch.app.domain.company.CompanyEmploymentSettings.hashCode(CompanyEmploymentSettings.java:33) ~[classes/:?]
goqiplq2

goqiplq21#

问题不在于CompanyAccessRights,而在于两者:

  • Company包含对CompanyEmploymentSettings
  • 包含对Company的引用

lomboks @EqualsAndHashCode通过在所有复杂类型字段上调用hashCode()方法来计算散列码,所以问题是CompanyEmploymentSettings.hashCode()调用Company.hashCode(),然后Company.hashCode()调用CompanyEmploymentSettings.hashCode(),一次又一次,直到您使用了所有堆栈内存-StackOverflowException。
要解决此问题,您可以移除其中一个字段,也可以使用@EqualsAndHashCode.Exclude标记这些字段以在hashCode计算中排除此字段

bweufnob

bweufnob2#

尝试使用fetch = FetchType.LAZY作为@OneToOne关系;

  1. @OneToOne(fetch = FetchType.LAZY)
  2. @JoinColumn(name = "company_access_rights")
  3. private CompanyAccessRights companyAccessRights;

希望它能解决你的问题。

相关问题