Comment gérer les références circulaires dans JPA et Hibernate avec une entité associative

Michiel:

J'ai 3 entités: Realestate , Realtor et l'entité associative RealestateRealtor . Un Realestate peut avoir plusieurs agents immobiliers et vice versa. La relation plusieurs-à-plusieurs a une entité supplémentaire RealestateRealtor avec un champ URL spécifique.

Question: Comment puis-je créer une référence de travail en utilisant @JsonIgnore, @JsonManaged etc ... afin que je puisse demander à un agent immobilier ayant tous ses enfants Realestate et dans une autre demande un Realestate ayant tous ses enfants Realtor sans paralyser l'un d'eux ou être impossible d'enregistrer en raison d'une entité non définie en raison de l'ignorance de la désérialisation.

Agent immobilier:

@Entity
@Table(name="realtor",uniqueConstraints={@UniqueConstraint(name = "uniquerealtor", columnNames = {"name", "streetname", "housenumber", "housenumberaddition", "cityname"})})
public class Realtor {

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer idrealtor;
    
    @NotEmpty
    @Column(length = 100)
    private String name;
    
    @NotEmpty
    private String streetname;
    
    @NotNull
    private Integer housenumber;
    
    @Column(length = 5)
    private String housenumberaddition;
    
    @NotEmpty
    private String cityname;

    @OneToMany(mappedBy = "realtor", cascade = CascadeType.ALL)
    @JsonBackReference(value = "realestateref")
    private Set<RealestateRealtor> realestaterealtor = new HashSet<RealestateRealtor>();
    
    public Integer getIdrealtor() {
        return idrealtor;
    }

    public void setIdrealtor(Integer idrealtor) {
        this.idrealtor = idrealtor;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getStreetname() {
        return streetname;
    }

    public void setStreetname(String streetname) {
        this.streetname = streetname;
    }

    public Integer getHousenumber() {
        return housenumber;
    }

    public void setHousenumber(Integer housenumber) {
        this.housenumber = housenumber;
    }

    public String getHousenumberaddition() {
        return housenumberaddition;
    }

    public void setHousenumberaddition(String housenumberaddition) {
        this.housenumberaddition = housenumberaddition;
    }

    public String getCityname() {
        return cityname;
    }

    public void setCityname(String cityname) {
        this.cityname = cityname;
    }

    public Set<RealestateRealtor> getRealestaterealtor() {
        return realestaterealtor;
    }

    public void setRealestaterealtor(Set<RealestateRealtor> realestaterealtor) {
        this.realestaterealtor = realestaterealtor;
    }
}

Immobilier:

@Entity
@Table(name="realestate",uniqueConstraints={@UniqueConstraint(name = "uniquerealestate",columnNames = {"streetname" , "housenumber", "housenumberaddition", "cityname"})})
public class Realestate {

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer idrealestate;
    
    @NotEmpty()
    private String streetname;
    
    @NotNull
    private Integer housenumber;
    
    @Column(length = 5)
    @javax.validation.constraints.NotNull
    private String housenumberaddition;
    
    @NotEmpty()
    private String cityname;
    
    @OneToMany(mappedBy = "realestate", cascade = CascadeType.ALL)
    @JsonManagedReference(value = "realestateref")
    private Set<RealestateRealtor> realestaterealtor = new HashSet<RealestateRealtor>();
    
    public Integer getIdrealestate() {
        return idrealestate;
    }

    public void setIdrealestate(Integer idrealestate) {
        this.idrealestate = idrealestate;
    }

    public String getStreetname() {
        return streetname;
    }

    public void setStreetname(String streetname) {
        this.streetname = streetname;
    }

    public Integer getHousenumber() {
        return housenumber;
    }

    public void setHousenumber(Integer housenumber) {
        this.housenumber = housenumber;
    }

    public String getHousenumberaddition() {
        return housenumberaddition;
    }

    public void setHousenumberaddition(String housenumberaddition) {
        this.housenumberaddition = housenumberaddition;
    }

    public String getCityname() {
        return cityname;
    }

    public void setCityname(String cityname) {
        this.cityname = cityname;
    }

    public Set<RealestateRealtor> getRealestaterealtor() {
        return realestaterealtor;
    }

    public void setRealestaterealtor(Set<RealestateRealtor> realestaterealtor) {
        this.realestaterealtor = realestaterealtor;
    }
}

RealestateRealtor:

@Entity
@Table(name="realestaterealtor")
public class RealestateRealtor {
    
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer idrealestaterealtor;
    
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "idrealestate")
    @JsonBackReference(value = "realestateref")
    private Realestate realestate;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "idrealtor")
    private Realtor realtor;

    @Column(name = "realestateurl")
    private String realestateurl;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "idrealestaterealtor", nullable = true)
    private Set<Media> media = new HashSet<Media>();
    
    public Integer getIdrealestaterealtor() {
        return idrealestaterealtor;
    }

    public void setIdrealestaterealtor(Integer idrealestaterealtor) {
        this.idrealestaterealtor = idrealestaterealtor;
    }

    public Realestate getRealestate() {
        return realestate;
    }
    
    public void setRealestate(Realestate realestate) {
        this.realestate = realestate;
    }

    public Realtor getRealtor() {
        return realtor;
    }
    
    public void setRealtor(Realtor realtor) {
        this.realtor = realtor;
    }

    public String getRealestateurl() {
        return realestateurl;
    }

    public void setRealestateurl(String realestateurl) {
        this.realestateurl = realestateurl;
    }

    public Set<Media> getMedia() {
        return media;
    }

    public void setMedia(Set<Media> media) {
        this.media = media;
    }
}

Le code publié ne fonctionne que pour la demande Realestate , et non l'inverse. La demande de l' agent immobilier ne se montre pas ses enfants.

Qu'ai-je essayé sans succès:

  1. @JSonIgnore uniquement sur les getters
  2. @JSonProperties ... allowGetters = false
  3. Plusieurs références gérées et arrière avec des valeurs uniques

Je n'ai pas essayé JSonViews, @JsonIdentityInfo ou un sérialiseur personnalisé

  • J'ai ajouté @JSonIdentityInfo:
@Entity
@Table(name="realestate",uniqueConstraints={@UniqueConstraint(name = "uniquerealestate",columnNames = {"streetname" , "housenumber", "housenumberaddition", "cityname"})})
    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,property = "idrealestate")
    public class Realestate {
@Entity
@Table(name="realtor",uniqueConstraints={@UniqueConstraint(name = "uniquerealtor", columnNames = {"name", "streetname", "housenumber", "housenumberaddition", "cityname"})})
    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,property = "idrealtor")
    public class Realtor {

Cela a abouti à un résultat de Realestate avec tous les agents immobiliers, mais a également abouti à un résultat de Realtor avec tous les agents immobiliers et tous les agents immobiliers appartenant au Realesatet, ce dernier `` problème '' a été résolu en l'annulant dans le contrôleur. L'agent immobilier

Kavithakaran Kanapathippillai:

Vous pouvez utiliser JSonViewsmais si vous avez une couche de service où la transaction se termine et une couche de contrôleur de repos, dans la couche de contrôleur de repos, vous pouvez interrompre la récursivité bidirectionnelle dans le code de contrôleur de repos .

  • Sur le point de terminaison de repos qui renvoie le type Realestate, puis dans le contrôleur de repos,realState.getRealestaterealtor().forEach(item -> item.setRealState(null)
  • Sur le point de terminaison de repos qui renvoie le type RealestateRealtor, puis dans le contrôleur de repos,realestateRealtor.getRealestate().setRealestateRealtor(null)

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

Gérer des modèles avec des références circulaires dans Spark SQL?

comment mettre à jour toutes les références d'une entité avec hibernate?

Doctrine DQL, récupérer correctement une entité entière avec toutes les références et les champs

Comment gérer correctement le champ de version dans une entité JPA avec Spring Data

Comment les modèles Typescript fonctionnent-ils avec les références circulaires et l'héritage?

Comment gérer un objet de classe avec des références circulaires?

Comment récupérer les associations FetchType.LAZY avec JPA et Hibernate dans un Spring Controller

Comment supprimer une entité avec une relation ManyToMany dans JPA (et les lignes de table de jointure correspondantes)?

Comment obtenir toutes les entités un-à-plusieurs dans une requête GET avec Spring Boot et JPA

C ++ Comment gérer un changement de pointeurs et de références dans une fonction?

Comment gérer les dépendances circulaires avec RequireJS / AMD?

Comment supprimer une entité avec l'aide de JPA et SE JOINT Hibernate

Comment gérer les documents circulaires dans MongoDB / DynamoDB?

Comment gérer les références circulaires entre les objets liés de différents modules en Python?

Comment utiliser "findBy" dans une entité avec un PK composite (Hibernate JPA)

Comment gérer les références DLL dans TFS?

Les "références circulaires" dans JPA sont-elles un anti-modèle?

Comment générer un script de création ddl avec une configuration Spring Boot + Data JPA et Hibernate moderne?

Dans JPA, comment trouverais-je tous les types qui ont une valeur de propriété et une entité associée à ManyTomany avec une valeur de propriété ?

Comment éviter les références circulaires dans les alias de type

Générer un journal des modifications avec Liquibase et les entités JPA

Comment restreindre Hibernate pour générer une requête SQL avec des colonnes uniquement à partir de l'entité racine dans l'API Criteria impliquant plusieurs entités

Comment Java Garbage Collection fonctionne-t-il avec les références circulaires?

Comment éviter les importations circulaires dans une application Flask avec les modèles Flask SQLAlchemy?

Comment obtenir une seule instance pour une entité en lecture seule associée avec JPA et Hibernate?

Comment gérer une entité un à plusieurs à l'aide de JPA et Spring Data Rest

Comment récupérer des entités avec plusieurs paramètres avec Spring et JPA

Comment identifier les références circulaires dans un grand projet

Comment gérer les références d'entités inconnues?

TOP liste

  1. 1

    comment supprimer "compte de connexion google" à des fins de développement - actions sur google

  2. 2

    J'ai besoin de savoir si ces deux phrases sont les mêmes en programmation

  3. 3

    Microsoft.WebApplication.targets

  4. 4

    Création d'un nouvel objet d'une classe avec un nouveau nom en cliquant sur un bouton dans java swing

  5. 5

    La taille de la forme n'est pas égale à la taille de la cellule du tableau et ajuste le texte à l'intérieur de la forme

  6. 6

    Javascript indiquant "impossible de définir la propriété 'innerHTML' sur null"

  7. 7

    Pourquoi utiliser Asyncio ne réduit pas le temps d'exécution global en Python et n'exécute pas les fonctions simultanément?

  8. 8

    Création d'un rappel python pour une fonction C à partir d'une DLL avec un tampon char.

  9. 9

    Trouver l'intersection et l'union de deux rectangles

  10. 10

    Comment convertir une chaîne en tuple en utilisant `reads`?

  11. 11

    Empêcher l'allocation de mémoire dans la génération de combinaison récursive

  12. 12

    Restauration de la sauvegarde de la base de données SQL Server sur la version inférieure

  13. 13

    Nextcloud avec Docker: impossible de créer ou d'écrire dans le répertoire de données

  14. 14

    Compter combien de fois un nombre apparaît dans un tableau aléatoire

  15. 15

    java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver

  16. 16

    java.lang.NoClassDefFoundError: org / springframework / data / repository / config / BootstrapMode

  17. 17

    Créer un graphique à barres avec une fréquence relative / à partir d'un objet de table dans R

  18. 18

    comment le contrôle de tableau javascript devrait-il être

  19. 19

    Importation bizarre de Google Sheets importxml - Impossible d'obtenir le chemin correct vers les éléments

  20. 20

    Injecter des éléments dans une liste existante au printemps

  21. 21

    Placez le modeBar en haut au centre à l'aide de plotly.js

chaudétiquette

Archive