StackOverflowError 스택 오버플로우 오류
2882 단어 J2EE
문제의 기본 원리는 다음과 같습니다.
Class A{
public A(){
a= new A();
}
}
이게 자바를 만들지 않을 수 있다고.lang.Stack Overflow Error 그렇기 때문에 코드를 쓰는 것을 피하려면 방법체(자신의 Constructer 제외)에 넣거나 Static에 넣어야 합니다. 상기 코드는 JVM의 명령을 사용합니다. 사실은 다음과 같습니다.
0: aload_0
1: invokespecial #1; //Method java/lang/object .
4: aload_0
5: new #2; //class A
8: dup
9: invokespecial #3; //Method java/lang/object .
12: putfield #4; //Field a:LA;
15: return
여기서constructer에서는 init를 호출하고 static는cinit를 호출합니다. 따라서 우리는 자신의 대상을static에 넣으면 순환을 찾을 수 없고, 자신을constructer에 넣으면 init를 끊임없이 호출하기 때문에 위의java가 발생합니다.lang.Stack Overflow Error 오버플로우 오류.
물론 일반인들은 이렇게 저급한 잘못을 저지르지 않을 것이다.
다음은 제 프로젝트에 부딪힌 문제를 말씀드리겠습니다.
나의 문제는 어떤 종류에서 다른 종류와 일대다 관계가 있기 때문이다.사순환에 빠지다.
코드는 다음과 같습니다.
일대다 클래스: User.java
public class User {
private List lettersForFromId;
private List lettersForToId;
public User() {}
@OneToMany(fetch = FetchType.LAZY, mappedBy = "userByFromId")
public List getLettersForFromId() {
return this.lettersForFromId;
}
public void setLettersForFromId(List lettersForFromId) {
this.lettersForFromId = lettersForFromId;
}
@OneToMany(fetch = FetchType.LAZY, mappedBy = "userByToId")
public List getLettersForToId() {
return this.lettersForToId;
}
public void setLettersForToId(List lettersForToId) {
this.lettersForToId = lettersForToId;
}
}
다대일류:Letter.java
public class Letter extends IdEntity {
private static final long serialVersionUID = -2305610965537901463L;
private User userByToId;
private User userByFromId;
public Letter() {
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "to_id", nullable = false)
public User getUserByToId() {
return this.userByToId;
}
public void setUserByToId(User userByToId) {
this.userByToId = userByToId;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "from_id", nullable = false)
public User getUserByFromId() {
return this.userByFromId;
}
public void setUserByFromId(User userByFromId) {
this.userByFromId = userByFromId;
}
위의 예를 보고 자세히 비교해 보면 발견하기 어렵지 않다.나의 User와 Letter가 무한히 귀속되어 사순환에 빠지고 창고가 넘쳐흐르게 한다.
해결 방법:
Letter의 모든 호출 User에 @JsonIgnore를 추가합니다. 예를 들어,
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "to_id", nullable = false)
@JsonIgnore
public User getUserByToId() {
return this.userByToId;
}
Ps: 데이터베이스에서 요청한 것은 json 형식이기 때문입니다.
@JsonIgnore는 더 이상 아래로 편리하지 않다는 뜻입니다.
여기까지, 문제가 해결되었다.
여기에는 주로 학습 노트를 기록하는데, 같은 문제에 부딪힌 친구를 도울 수 있기를 바랍니다.
구체적인 문제는 역시 구체적으로 분석해야 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[상단] j2ee 규범 - EJBJ2EE가 이 문제에 대한 처리 방법은 업무 논리를 클라이언트 소프트웨어에서 추출하여 한 그룹에 봉인하는 것이다 부품 중.이 구성 요소는 하나의 독립된 서버에서 실행되며, 클라이언트 소프트웨어는 네트워크를 통해 구성...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.