Seleccionar página

En un proyecto en el que estoy trabajando, mi cliente requiere que unos datos sean trabajados en Odoo y otros a través del sistema que se le está desarrollando.

El primer punto de registro es Odoo así que hay que leer los datos de los clientes desde Odoo. Para esto hicimos unos webservices en java y creamos las entidades de jpa a través de una ingeniería inversa desde la base de datos de Odoo.

Nuestro problema, llámenlo ignorancia, era cómo mapear una entidad autoreferenciada con MOXy para que el servicio pudiera devolvernos un JSON bien formateado y no caer en problemas obvios de un cliclo recursivo en la entidad.

Buscamos información al respecto y realmente no se obtenía nada, pero la solución la teníamos frente a nosotros y como es típico cuando una solución es sencilla, no la veíamos.

La solución es simple, hay que hacer uso de la etiqueta @XmlInverseReference

El siguiente es un fragmento del código donde se muestra el uso de dicha etiqueta para poder resolver esa autoreferencia.

@Entity
@Table(name = "res_partner", schema = "public")
@XmlRootElementpublic 
class ResPartner implements java.io.Serializable {
// Fields

private String id;
private ResPartner resPartnerByMedicotratante;
private Set < ResPartner > resPartnersForMedicotratante = new HashSet< ResPartner >(0);

// Property accessors
@Id
@Column(name = "id", unique = true, nullable = false)
@XmlID
public String getId() {
    return this.id;
} 
public void setId(String id) {
    this.id = id;
}

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "medicotratante")
@XmlInverseReference(mappedBy="resPartnersForMedicotratante")
public ResPartner getResPartnerByMedicotratante() {
    return this.resPartnerByMedicotratante;
} 

public void setResPartnerByMedicotratante(ResPartner resPartnerByMedicotratante) {
    this.resPartnerByMedicotratante = resPartnerByMedicotratante;
}

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "resPartnerByMedicotratante")
public Set < ResPartner > getResPartnersForMedicotratante() {
	return this.resPartnersForMedicotratante;
}

public void setResPartnersForMedicotratante(Set < ResPartner > resPartnersForMedicotratante) {
	this.resPartnersForMedicotratante = resPartnersForMedicotratante;
}

La etiqueta se coloca en nuestra relación Muchos a uno (ManyToOne) usando en mappedby la propiedad declarada en la relación Uno a muchos (OneToMany) , en este caso resPartnersForMedicotratante.