2

Entity-relationship diagram:

ERD

I want to receive a translation, but the element will link back to translation. So it will crash because it keeps looping..

Translation entity:

package com.exstodigital.photofactory.model;

import javax.persistence.*;

import java.io.Serializable;

/**
 * Created by youri on 21-09-16.
 */
@Table(name = "translation")
@Entity
public class Translation implements Serializable {
    @Id
    @GeneratedValue
    private int id;

    public int getId() {
        return id;
    }

    private String text;

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    @OneToOne
    @JoinColumn(name = "language_id")
    private Language language;

    public Language getLanguage() {
        return language;
    }

    @OneToOne
    @JoinColumn(name = "element_id")
    private Element element;

    public Element getElement() {
        return element;
    }

    public Translation(int id, String text) {
        this.id = id;
        this.text = text;
    }

    public Translation() {
        // Empty constructor
    }

    @Override
    public boolean equals(Object obj) {
        return obj instanceof Translation && (!this.text.equals(((Translation) obj).text));
    }
}

Element entity:

package com.exstodigital.photofactory.model;

import javax.persistence.*;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * Created by youri on 21-09-16.
 */
@Entity
@Table(name = "element")
public class Element implements Serializable {
    @Id
    @GeneratedValue
    private int id;

    public int getId() {
        return id;
    }

    private String label;

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    @OneToMany
    @JoinColumn(name = "element_id")
    private List<Translation> translations = new ArrayList<>();

    public List<Translation> getTranslations() {
        return Collections.unmodifiableList(translations);
    }

    public Element(int id, String label) {
        this.id = id;
        this.label = label;
    }

    public Element() {
        // Empty constructor
    }

    @Override
    public boolean equals(Object obj) {
        return obj instanceof Element && (this.id != ((Element) obj).id || !this.label.equals(((Element) obj).label));
    }
}

TranslationDaoImpl:

@Override
public Translation get(int id) {
    return sessionFactory.openSession().get(Translation.class, id);
}
yooouuri
  • 2,578
  • 10
  • 32
  • 54
  • Possible duplicate of [Infinite Recursion with Jackson JSON and Hibernate JPA issue](https://stackoverflow.com/questions/3325387/infinite-recursion-with-jackson-json-and-hibernate-jpa-issue) – Rumid Sep 17 '17 at 10:11

1 Answers1

2

You have established wrong relationship, from one side you are giving OneToOne and with same but from second entity you are giving OneToMany

Your code:

@Table(name = "translation")
@Entity
public class Translation implements Serializable {

    @OneToOne
    @JoinColumn(name = "element_id")
    private Element element;

}

@Entity
@Table(name = "element")
public class Element implements Serializable {

    @OneToMany
    @JoinColumn(name = "element_id")
    private List<Translation> translations = new ArrayList<>();
}

Right code for OneToOne :

@Table(name = "translation")
@Entity
public class Translation implements Serializable {

    @JsonIgnore    
    @OneToOne
    @JoinColumn(name = "element_id")
    private Element element;

}

@Entity
@Table(name = "element")
public class Element implements Serializable {

    @OneToOne
    (mappedBy="element")
    private Translation translation;
}

Right code for OneToMany :

@Table(name = "translation")
@Entity
public class Translation implements Serializable {

    @JsonIgnore
    @ManyToOne
    @JoinColumn(name = "element_id")
    private Element element;

}

@Entity
@Table(name = "element")
public class Element implements Serializable {

    @OneToMany
    (mappedBy="element")
    private List<Translation> translations;
}

Use "@JsonIgnore" to avoid Infinite recursion that is coming into your code

Riddhi Gohil
  • 1,758
  • 17
  • 17