下面两个类关联:
News:
package com.lin.springdata.entities;
import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import java.util.LinkedList;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@Entity
@Table(name="TB_NEWS")
public class News implements Serializable {
private static final long serialVersionUID = 4713558903448287254L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@Column(name = "title",nullable=false)
private String title;
@Column(name="content",nullable=false)
private String content;
@Column(name="createDate",nullable=false)
private Date createDate;
@OneToOne(fetch=FetchType.LAZY, mappedBy="news",cascade=CascadeType.ALL)
private NewsDetails newsDetails;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "news", cascade = CascadeType.ALL)
private Collection<Comment> comments = new LinkedList<>();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
public NewsDetails getNewsDetails() {
return newsDetails;
}
public void setNewsDetails(NewsDetails newsDetails) {
this.newsDetails = newsDetails;
}
public Collection<Comment> getComments() {
return comments;
}
public void setComments(Collection<Comment> comments) {
this.comments = comments;
}
@Override
public String toString() {
return "News [id=" + id + ", title=" + title + ", content=" + content
+ ", createDate=" + createDate + ", newsDetails=" + newsDetails
+ ", comments=" + comments + "]";
}
}
NewsDetails:
package com.lin.springdata.entities;
import java.io.Serializable;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@Table(name="TB_NEWS_DETAILS")
@Entity
public class NewsDetails implements Serializable {
private static final long serialVersionUID = -2559429260718718580L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@Column(name="details",nullable=false)
private String details;
@OneToOne(cascade = {CascadeType.PERSIST, CascadeType.REMOVE},fetch=FetchType.LAZY)
@JoinColumn(name="news_id",unique=true)
private News news;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDetails() {
return details;
}
public void setDetails(String details) {
this.details = details;
}
public News getNews() {
return news;
}
public void setNews(News news) {
this.news = news;
}
@Override
public String toString() {
return "NewsDetails [id=" + id + ", details=" + details + ", news="
+ news + "]";
}
}
News和NewsDetails的toString方法都被覆写了,直接输出news和newsDetails对象时会调用他们的toString方法。在news的toString中输出newsDetails时,调用newsDetails的toString方法,在newsDetails的toString中又输出news,又调用news的toString方法,所以这种递归调用得不到终止,就会报java.lang.StackOverflowError。