JPA Hibernate一对一关系错误

问题描述 投票:0回答:2

我正在尝试实现 OneToOne 关系 bw 3 个实体,但面临这个与哈希码相关的错误。我在 2 个类中有 3 个类,我正在尝试访问一个 companyaccessright 实体。

公司访问权限-

@Entity
@Table(name = "company_access_rights")
@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
public class CompanyAccessRights{

}
@Entity
@Table(name = "companies")
@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
public class Company{
    @OneToOne
    @JoinColumn(name = "company_access_rights")
    private  CompanyAccessRights companyAccessRights;
}
@Entity
@Table(name = "company_employment_settings")
@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
public class CompanyEmploymentSettings{
   @OneToOne
    @JoinColumn(name = "company_access_rights")
    private  CompanyAccessRights companyAccessRights;
}

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
java.lang.StackOverflowError: null
    at ch.talmatch.app.domain.company.Company.hashCode(Company.java:19) ~[classes/:?]
    at ch.talmatch.app.domain.company.CompanyEmploymentSettings.hashCode(CompanyEmploymentSettings.java:33) ~[classes/:?]
    at ch.talmatch.app.domain.company.Company.hashCode(Company.java:19) ~[classes/:?]
    at ch.talmatch.app.domain.company.CompanyEmploymentSettings.hashCode(CompanyEmploymentSettings.java:33) ~[classes/:?]
    at ch.talmatch.app.domain.company.Company.hashCode(Company.java:19) ~[classes/:?]
    at ch.talmatch.app.domain.company.CompanyEmploymentSettings.hashCode(CompanyEmploymentSettings.java:33) ~[classes/:?]
    at ch.talmatch.app.domain.company.Company.hashCode(Company.java:19) ~[classes/:?]
    at ch.talmatch.app.domain.company.CompanyEmploymentSettings.hashCode(CompanyEmploymentSettings.java:33) ~[classes/:?]
    at ch.talmatch.app.domain.company.Company.hashCode(Company.java:19) ~[classes/:?]
    at ch.talmatch.app.domain.company.CompanyEmploymentSettings.hashCode(CompanyEmploymentSettings.java:33) ~[classes/:?]
    at ch.talmatch.app.domain.company.Company.hashCode(Company.java:19) ~[classes/:?]
    at ch.talmatch.app.domain.company.CompanyEmploymentSettings.hashCode(CompanyEmploymentSettings.java:33) ~[classes/:?]
    at ch.talmatch.app.domain.company.Company.hashCode(Company.java:19) ~[classes/:?]
    at ch.talmatch.app.domain.company.CompanyEmploymentSettings.hashCode(CompanyEmploymentSettings.java:33) ~[classes/:?]
    at ch.talmatch.app.domain.company.Company.hashCode(Company.java:19) ~[classes/:?]
    at ch.talmatch.app.domain.company.CompanyEmploymentSettings.hashCode(CompanyEmploymentSettings.java:33) ~[classes/:?]
    at ch.talmatch.app.domain.company.Company.hashCode(Company.java:19) ~[classes/:?]
    at ch.talmatch.app.domain.company.CompanyEmploymentSettings.hashCode(CompanyEmploymentSettings.java:33) ~[classes/:?]

java spring-boot hibernate jpa
2个回答
0
投票

问题不在于

CompanyAccessRights
,而在于两者:

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

lomboks

@EqualsAndHashCode
正在通过在所有复杂类型字段上调用
hashCode()
方法来计算哈希码,所以问题是
CompanyAccessRights.hashCode()
正在调用
Company.hashCode()
然后
Company.hashCode()
正在调用
CompanyAccessRights.hashCode()
一次又一次,直到你用完所有的堆栈内存——StackOverflowException。

要解决这个问题,您可以删除其中一个字段,或者您可以用

@EqualsAndHashCode.Exclude
标记这些字段以在 hashCode 计算中排除该字段


0
投票

尝试使用

fetch = FetchType.LAZY
来建立
@OneToOne
关系;

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

希望能解决你的问题

© www.soinside.com 2019 - 2024. All rights reserved.