使用 hibernate / spring-boot 连接 3 个表

Connecting 3 tables with hibernate / spring-boot

我无法理解如何将 3 table 与 spring-boot / hibernate 连接。 表格是:用户、技术、类别

每个用户都拥有所有 10 个类别,但在这些类别中,他们可以保存一项或多项技术。每项技术都可以列在几个不同的类别中。

我有一个代码现在可以部分工作,而不是引用 table 类别,我只是在创建新类别,所以我的 BDD 中有重复项。 理想情况下,我希望每个用户数据结构都像这样(伪代码):

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

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

    }
    .
    .
    .   
}

我的 table 是:

用户TABLE

public class MyUser {

// other properties

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

技术

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;
}

技术类别:

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;
}

和 table 我试图将用户与类别联系起来(每个类别都有技术列表)

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;
}

所以我有 tried/read 这个: Joining three tables using MySQL

Hibernate: How to Join three 3 tables in one join table in Annotation?

Hibernate: mapping 3 tables

但没有成功,因为每次尝试实施上述解决方案都会导致我无法解决的异常(所有与休眠相关的无法创建 tables)。 谢谢

如果我理解正确,假设您的示例代码有效,这样的事情对您有用:

用户 class,加入类别:

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;
    
}

类别实体,包含技术类别和技术:

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;
    
}

技术类别实体:

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;
}

技术实体:

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;
}

如果您不希望这些 ID 显示在您的 JSON 中,只需将 @JsonIgnore 注释放在 ID 上方即可 属性.