Java >> Java Tutorial >  >> Tag >> Spring

Verbinden von 3 Tabellen mit Ruhezustand / Spring-Boot

Ich habe Probleme zu verstehen, wie man 3 Tabellen mit Spring-Boot / Hibernate verbindet. Tabellen sind:Benutzer, Technologien, Kategorien

Jeder Benutzer hat alle 10 Kategorien, aber innerhalb dieser Kategorien kann er eine oder mehrere Technologien speichern. Jede Technologie kann in mehreren verschiedenen Kategorien aufgeführt werden.

Ich habe einen Code, der vorerst teilweise funktioniert, anstatt auf die Tabellenkategorie zu verweisen. Ich erstelle gerade eine neue Kategorie, damit ich Duplikate in meinem BDD habe. Idealerweise hätte ich gerne für jede Benutzerdatenstruktur, die so etwas mag (in Pseudo- Code):

{
    {
    "category1" : {id, name}
    "technologies" [{id, name}, {id, name}, {id, name} ]
    },

    {
    "category2" : {id, name}
    "technologies

    }
    .
    .
    .   
}

Meine Tabellen sind:

BENUTZERTABELLE

public class MyUser {

// other properties

@OneToMany(mappedBy="id")
    private Collection<Category> categories;
}

TECHNOLOGIE

public class Technology {

// other properties

    @Id
    @SequenceGenerator(name = "id_seq", sequenceName = "id_seq", allocationSize = 1, initialValue = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_seq")
    private int id;

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

TECHNOLOGIEKATEGORIE:

public class TechnologyCategory {

// other properties

    @Id
    @SequenceGenerator(name = "id_seq", sequenceName = "id_seq", allocationSize = 1, initialValue = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_seq")
    private int id;

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

und die Tabelle, in der ich versuche, Benutzer mit Kategorien zu verbinden (von denen jeder eine Liste von Technologien hat)

USER_CATEGORIES

public class UserCategory {

    @Id
    @SequenceGenerator(name = "id_seq", sequenceName = "id_seq", allocationSize = 1, initialValue = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_seq")
    private int id;

    @Column(name = "name")
    private String technologyCategory; // here I would love to reference technology category table

    @ManyToMany()
    Collection <Technology> technologies;
}

also habe ich das versucht/gelesen:Joining three tables using MySQL

ManyToManyToMany – Verbinden von drei Tabellen mit Hibernate-Anmerkungen

Hibernate:Wie verbinde ich drei 3-Tabellen in einer Join-Tabelle in Annotation?

Ruhezustand:Mapping von 3 Tabellen

aber ohne Erfolg, da jeder Versuch, die oben genannten Lösungen zu implementieren, zu Ausnahmen führte (alle im Zusammenhang mit dem Ruhezustand, die keine Tabellen erstellen konnten), die ich nicht lösen konnte. Vielen Dank

Antwort

Wenn ich das richtig verstanden habe, würde so etwas für Sie funktionieren, vorausgesetzt, Ihr Beispielcode funktioniert:

Benutzerklasse, die den Kategorien beitritt:

public class User {

    @Id
    @SequenceGenerator(name = "id_seq", sequenceName = "id_seq", allocationSize = 1, initialValue = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_seq")
    private int id;

    // other properties

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "user_categories", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "category_id", referencedColumnName = "id"))
    private Set<Category> categories;
    
}

Kategorieentität, die die Kategorie der Technologie und die Technologien enthält:

public class Category {

    @Id
    @SequenceGenerator(name = "id_seq", sequenceName = "id_seq", allocationSize = 1, initialValue = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_seq")
    private int id;

    // other properties

    @ManyToOne
    @JoinColumn(name = "technology_category_id")
    private TechnologyCategory category;
    
    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "category_technologies", joinColumns = @JoinColumn(name = "category_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "technology_id", referencedColumnName = "id"))
    private Set<Technology> technologies;
    
}

TechnologyCategory-Entität:

public class TechnologyCategory {

    // other properties

    @Id
    @SequenceGenerator(name = "id_seq", sequenceName = "id_seq", allocationSize = 1, initialValue = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_seq")
    private int id;

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

Technologieentität:

public class Technology {

    // other properties

    @Id
    @SequenceGenerator(name = "id_seq", sequenceName = "id_seq", allocationSize = 1, initialValue = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_seq")
    private int id;

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

Wenn Sie nicht möchten, dass die IDs in Ihrem JSON angezeigt werden, setzen Sie einfach die Annotation @JsonIgnore über die Eigenschaft id.


Java-Tag