我正在使用JPA,我正在尝试使用GSON将其序列化为JSON。 由于循环引用,我不断得到堆栈溢出。
这是班级
@Entity
@Table(name = "STUDENT")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Student.findAll", query = "SELECT s FROM Student s"),
@NamedQuery(name = "Student.findById", query = "SELECT s FROM Student s WHERE s.id = :id"),
@NamedQuery(name = "Student.findByName", query = "SELECT s FROM Student s WHERE s.name = :name"),
@NamedQuery(name = "Student.findBySurname", query = "SELECT s FROM Student s WHERE s.surname = :surname"),
@NamedQuery(name = "Student.findByFaculty", query = "SELECT s FROM Student s WHERE s.faculty = :faculty")})
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "ID")
private Integer id;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 50)
@Column(name = "NAME")
private String name;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 50)
@Column(name = "SURNAME")
private String surname;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 50)
@Column(name = "FACULTY")
private String faculty;
@JoinColumn(name = "COURSE_ID", referencedColumnName = "ID")
@ManyToOne(optional = false)
private Course courseId;
public Student() {
}
public Student(Integer id) {
this.id = id;
}
public Student(Integer id, String name, String surname, String faculty) {
this.id = id;
this.name = name;
this.surname = surname;
this.faculty = faculty;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
public String getFaculty() {
return faculty;
}
public void setFaculty(String faculty) {
this.faculty = faculty;
}
public Course getCourseId() {
return courseId;
}
public void setCourseId(Course courseId) {
this.courseId = courseId;
}
@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Student)) {
return false;
}
Student other = (Student) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public String toString() {
return "models.Student[ id=" + id + " ]";
}
}
我尝试使用transient关键字和注释,例如
private transient Course courseId;
或
@Transient
private Course courseId;
但它根本没有帮助。 解决这个问题的方法是什么?
这是课程课程:
@Entity
@Table(name = "COURSE")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Course.findAll", query = "SELECT c FROM Course c"),
@NamedQuery(name = "Course.findById", query = "SELECT c FROM Course c WHERE c.id = :id"),
@NamedQuery(name = "Course.findByName", query = "SELECT c FROM Course c WHERE c.name = :name")})
public class Course implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "ID")
private Integer id;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 50)
@Column(name = "NAME")
private String name;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "courseId")
private Collection<Student> studentCollection;
public Course() {
}
public Course(Integer id) {
this.id = id;
}
public Course(Integer id, String name) {
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlTransient
public Collection<Student> getStudentCollection() {
return studentCollection;
}
public void setStudentCollection(Collection<Student> studentCollection) {
this.studentCollection = studentCollection;
}
@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Course)) {
return false;
}
Course other = (Course) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public String toString() {
return "models.Course[ id=" + id + " ]";
}
}