![](/img/trans.png)
[英]Hibernate causes infinite loop with @ManyToMany bidirectional relation
[英]JPA hibernate one to many infinite loop bidirectional relation problem
我使用 JAP ( @Entity
) 在兩個表之間建立了雙向關系。 當我執行 Select throw repository.findAll()
它會返回給我一個無限循環的對象內部和其他內部對象。
這里是第一個實體:
@Entity
@Table(name = "TIPOS_DOCUMENTOS_IDENTIDAD")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "TiposDocumentosIdentidad.findAll", query = "SELECT t FROM TiposDocumentosIdentidad t"),
@NamedQuery(name = "TiposDocumentosIdentidad.findByTidoId", query = "SELECT t FROM TiposDocumentosIdentidad t WHERE t.tidoId = :tidoId"),
@NamedQuery(name = "TiposDocumentosIdentidad.findByTidoDescripcion", query = "SELECT t FROM TiposDocumentosIdentidad t WHERE t.tidoDescripcion = :tidoDescripcion"),
@NamedQuery(name = "TiposDocumentosIdentidad.findByTidoSiglas", query = "SELECT t FROM TiposDocumentosIdentidad t WHERE t.tidoSiglas = :tidoSiglas")})
public class TiposDocumentosIdentidad implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@GeneratedValue(strategy = GenerationType.AUTO, generator = "TIDO_TIDO_ID_SEQ")
@Column(name = "TIDO_ID")
private Integer tidoId;
@Basic(optional = false)
@Column(name = "TIDO_DESCRIPCION")
private String tidoDescripcion;
@Basic(optional = false)
@Column(name = "TIDO_SIGLAS")
private String tidoSiglas;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "tidoId")
private Collection<Personas> personasCollection;
.
.
@XmlTransient
public Collection<Personas> getPersonasCollection() {
return personasCollection;
}
public void setPersonasCollection(Collection<Personas> personasCollection) {
this.personasCollection = personasCollection;
}
.
.
第二實體:
@Entity
@Table(name = "PERSONAS")
@XmlRootElement
public class Person as implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@GeneratedValue(strategy = GenerationType.AUTO, generator = "PERSONAS_PERS_ID_SEQ")
@Column(name = "PERS_ID")
private Integer persId;
@Column(name = "PERS_DIGITO_VERIFICACION")
private String persDigitoVerificacion;
@Basic(optional = false)
@Column(name = "PERS_NUMERO_DOCUMENTO")
private String persNumeroDocumento;
@Basic(optional = false)
@Column(name = "PERS_FECHA_CREACION")
@Temporal(TemporalType.TIMESTAMP)
private Date persFechaCreacion;
@PrePersist
public void prePersist() {
persFechaCreacion = new Date();
}
@JoinColumn(name = "TIDO_ID", referencedColumnName = "TIDO_ID")
@ManyToOne(optional = false)
private TiposDocumentosIdentidad tidoId;
.
.
.
這是 pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>co.com.personasProject</groupId>
<artifactId>personasProject</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>personasProject</name>
<description></description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<scope>runtime</scope>
</dependency>
<!-- <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
我該如何解決這個錯誤? 我只有 q 行 int 兩個表
嘗試使用@JsonManagedReference
和@JsonBackReference
注釋關系,讓 Jackson 更好地處理雙向關系:
@Entity
@Table(name = "TIPOS_DOCUMENTOS_IDENTIDAD")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "TiposDocumentosIdentidad.findAll", query = "SELECT t FROM TiposDocumentosIdentidad t"),
@NamedQuery(name = "TiposDocumentosIdentidad.findByTidoId", query = "SELECT t FROM TiposDocumentosIdentidad t WHERE t.tidoId = :tidoId"),
@NamedQuery(name = "TiposDocumentosIdentidad.findByTidoDescripcion", query = "SELECT t FROM TiposDocumentosIdentidad t WHERE t.tidoDescripcion = :tidoDescripcion"),
@NamedQuery(name = "TiposDocumentosIdentidad.findByTidoSiglas", query = "SELECT t FROM TiposDocumentosIdentidad t WHERE t.tidoSiglas = :tidoSiglas")})
public class TiposDocumentosIdentidad implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@GeneratedValue(strategy = GenerationType.AUTO, generator = "TIDO_TIDO_ID_SEQ")
@Column(name = "TIDO_ID")
private Integer tidoId;
@Basic(optional = false)
@Column(name = "TIDO_DESCRIPCION")
private String tidoDescripcion;
@Basic(optional = false)
@Column(name = "TIDO_SIGLAS")
private String tidoSiglas;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "tidoId")
@JsonManagedReference
private Collection<Personas> personasCollection;
.
.
@XmlTransient
public Collection<Personas> getPersonasCollection() {
return personasCollection;
}
public void setPersonasCollection(Collection<Personas> personasCollection) {
this.personasCollection = personasCollection;
}
.
.
@Entity
@Table(name = "PERSONAS")
@XmlRootElement
public class Person as implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@GeneratedValue(strategy = GenerationType.AUTO, generator = "PERSONAS_PERS_ID_SEQ")
@Column(name = "PERS_ID")
private Integer persId;
@Column(name = "PERS_DIGITO_VERIFICACION")
private String persDigitoVerificacion;
@Basic(optional = false)
@Column(name = "PERS_NUMERO_DOCUMENTO")
private String persNumeroDocumento;
@Basic(optional = false)
@Column(name = "PERS_FECHA_CREACION")
@Temporal(TemporalType.TIMESTAMP)
private Date persFechaCreacion;
@PrePersist
public void prePersist() {
persFechaCreacion = new Date();
}
@JoinColumn(name = "TIDO_ID", referencedColumnName = "TIDO_ID")
@ManyToOne(optional = false)
@JsonBackReference
private TiposDocumentosIdentidad tidoId;
.
.
.
}
假設您使用 Jackson 序列化為 JSON,這應該可以解決它。 您可以在https://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion閱讀更多信息。
另一種選擇是使用@JsonIdentityInfo
如下(它也需要 Jackson):
@Entity
@Table(name = "TIPOS_DOCUMENTOS_IDENTIDAD")
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "tidoId")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "TiposDocumentosIdentidad.findAll", query = "SELECT t FROM TiposDocumentosIdentidad t"),
@NamedQuery(name = "TiposDocumentosIdentidad.findByTidoId", query = "SELECT t FROM TiposDocumentosIdentidad t WHERE t.tidoId = :tidoId"),
@NamedQuery(name = "TiposDocumentosIdentidad.findByTidoDescripcion", query = "SELECT t FROM TiposDocumentosIdentidad t WHERE t.tidoDescripcion = :tidoDescripcion"),
@NamedQuery(name = "TiposDocumentosIdentidad.findByTidoSiglas", query = "SELECT t FROM TiposDocumentosIdentidad t WHERE t.tidoSiglas = :tidoSiglas")})
public class TiposDocumentosIdentidad implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@GeneratedValue(strategy = GenerationType.AUTO, generator = "TIDO_TIDO_ID_SEQ")
@Column(name = "TIDO_ID")
private Integer tidoId;
@Basic(optional = false)
@Column(name = "TIDO_DESCRIPCION")
private String tidoDescripcion;
@Basic(optional = false)
@Column(name = "TIDO_SIGLAS")
private String tidoSiglas;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "tidoId")
private Collection<Personas> personasCollection;
.
.
@XmlTransient
public Collection<Personas> getPersonasCollection() {
return personasCollection;
}
public void setPersonasCollection(Collection<Personas> personasCollection) {
this.personasCollection = personasCollection;
}
.
.
@Entity
@Table(name = "PERSONAS")
@XmlRootElement
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "persId")
public class Person as implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@GeneratedValue(strategy = GenerationType.AUTO, generator = "PERSONAS_PERS_ID_SEQ")
@Column(name = "PERS_ID")
private Integer persId;
@Column(name = "PERS_DIGITO_VERIFICACION")
private String persDigitoVerificacion;
@Basic(optional = false)
@Column(name = "PERS_NUMERO_DOCUMENTO")
private String persNumeroDocumento;
@Basic(optional = false)
@Column(name = "PERS_FECHA_CREACION")
@Temporal(TemporalType.TIMESTAMP)
private Date persFechaCreacion;
@PrePersist
public void prePersist() {
persFechaCreacion = new Date();
}
@JoinColumn(name = "TIDO_ID", referencedColumnName = "TIDO_ID")
@ManyToOne(optional = false)
@JsonBackReference
private TiposDocumentosIdentidad tidoId;
.
.
.
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.