我正在尝试实现 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/:?]
问题不在于
CompanyAccessRights
,而在于两者:
Company
包含对 CompanyAccessRights
和CompanyAccessRights
包含对Company
lomboks
@EqualsAndHashCode
正在通过在所有复杂类型字段上调用 hashCode()
方法来计算哈希码,所以问题是 CompanyAccessRights.hashCode()
正在调用 Company.hashCode()
然后 Company.hashCode()
正在调用 CompanyAccessRights.hashCode()
一次又一次,直到你用完所有的堆栈内存——StackOverflowException。
要解决这个问题,您可以删除其中一个字段,或者您可以用
@EqualsAndHashCode.Exclude
标记这些字段以在 hashCode 计算中排除该字段
尝试使用
fetch = FetchType.LAZY
来建立@OneToOne
关系;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "company_access_rights")
private CompanyAccessRights companyAccessRights;
希望能解决你的问题