J'ai une base de données comme celle-ci :

CREATE TABLE unit
(
    id INTEGER NOT NULL,
    name VARCHAR,
);

CREATE TABLE unit_composition
(
    parent_id INTEGER NOT NULL,
    child_id INTEGER NOT NULL,
    quantity INTEGER,
CONSTRAINT child_fk FOREIGN KEY (parent_id)
        REFERENCES public.refdse (id) MATCH SIMPLE,
CONSTRAINT parent_fk FOREIGN KEY (parent_id)
        REFERENCES public.refdse (id) MATCH SIMPLE
);

ALTER TABLE unit_composition
    ADD CONSTRAINT composit_pk PRIMARY KEY (parent_id, art_nr);

J'ai un tableau des unités de fabrication. Chaque unité peut avoir plusieurs sous-unités, et les sous-unités peuvent avoir plusieurs sous-sous-unités et ainsi de suite. J'ai également un champ de quantité qui indique combien de sous-unités sont nécessaires pour fabriquer une seule unité. C'est donc une sorte de relation arborescente.

Maintenant, je veux le mapper à des classes avec Spring Data. J'ai une classe Unit avec un identifiant et un nom :

@Entity
@Table(name = "unit")
class Unit {

    @Id
    @Column(name = "id")
    private int id;

    @Column(name = "name")
    private String name;
...
}

J'ai créé une partie de classe secondaire :

class Part {
    
    private Unit unit;
    private int quantity;
    ...
}

Et j'ai besoin que la classe d'unité ait un champ comme List subUnits.

J'ai essayé de le faire avec des annotations @SecondaryTable et @JoinColumn, mais j'ai eu une erreur disant "Relation unit_unit n'existe pas". J'ai également essayé de faire de Part une @Entity mais elle n'a pas de champ Id. Alternativement, j'ai essayé de créer une classe @Embeddable PartId et d'insérer une instance dans la classe Part comme ceci :

@Embeddable
public class PartId implements Serializable {
    
    private Unit parentUnit;
    private Unit unit;

J'obtiens une erreur dans la classe PartId indiquant que "Le type de base ne doit pas être une entité de persistance" car il est intégrable et n'a pas de table qui lui est assignée.

Alors, comment puis-je faire en sorte que cela fonctionne en pouvant obtenir de manière récursive toutes les sous-unités (avec des sous-sous-unités, etc.) d'une unité donnée ? Je ne comprends pas très bien comment puis-je mapper une entité qui n'est en réalité que des liens d'une table à elle-même.

2
admi 3 nov. 2020 à 22:48

1 réponse

Meilleure réponse

Ma première solution consistait donc à créer un référentiel de modèles Jdbc et à créer simplement les listes nécessaires manuellement via des requêtes SQL. Mais j'ai trouvé une solution bien meilleure et plus simple qui nécessitait d'ajouter une colonne id à la table unit_composition et donc de faire de la classe Part une @Entity avec une relation @ManyToOne avec une classe Unit. Et le reste a été simplement fait par Spring Data.

0
admi 18 nov. 2020 à 06:45