@ManyToMany 关系只存储 id,没有任何额外的列和对对象的引用

@ManyToMany relationship to store ids only, without any extra columns and references to objects

我正在为这个用例寻找最佳映射设计:

我需要做的就是将外键引用存储在@ManyToMany 关系中,但在提取中,我不关心对象,只关心id 引用。 我有一个用户和一个餐厅关系: 用户可以“喜欢”餐厅,餐厅也可以被用户“喜欢”。 在我的前端,我需要为用户提供存储他们喜欢的东西并在以后获取它们的能力。

这是我到目前为止的结果:

@Entity
User

    @JsonIgnore
    @ManyToMany
    @JoinTable(name = "user_favorite_restaurants",
            joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name= "restaurant_id", referencedColumnName = "id"))
    public Set<Restaurant> userFavoriteRestaurants = new LinkedHashSet<>();

    @ElementCollection
    @CollectionTable(name="user_favorite_restaurants",
            joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"))
    @Column(name="restaurant_id")
    public Set<Long> restaurantIds;
@Entity
Restaurant

   @JsonIgnore
   @ManyToMany(mappedBy = "userFavoriteRestaurants")
   public Set<User> usersFavorite;

   @ElementCollection
   @CollectionTable(name="user_favorite_restaurants",
           joinColumns = @JoinColumn(name = "restaurant_id", referencedColumnName = "id"))
   @Column(name="user_id")
   public Set<Long> userIds;

Table userFavoriteRestaurants 是一个简单的两列 table,其中 user_id 和 restaurant_id。

有效。 userFavouriteRestaurants 有重复的 ManyToMany 交集 table user_favorite_restaurants.

这是要走的路,还是我是在搬起石头砸自己的脚? 我应该只创建一个实体 UserRestaurant 并创建一个带有 PK 的 table,还是这是解决问题的好方法?

如何以优化的方式return仅提供 ID?

奖金: 假设这种关系会随着时间的推移而扩展并且因此越早越需要 UserRestaurant 实体是否合乎逻辑?

实际上,两个实体中的 @ElementCollection 字段对我来说似乎都是不必要的。只需使用:

@Entity
public class User {
    private Long id;

    @JsonIgnore
    @ManyToMany
    @JoinTable(name = "user_favorite_restaurants",
        joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
        inverseJoinColumns = @JoinColumn(name= "restaurant_id", referencedColumnName = "id"))
    public Set<Restaurant> userFavoriteRestaurants = new LinkedHashSet<>();
}

@Entity
public class Restaurant {
    private Long id;

   @JsonIgnore
   @ManyToMany(mappedBy = "userFavoriteRestaurants")
   public Set<User> usersFavorite;
}

User 实体中定义的 @ManyToMany 映射将创建一个 junction table 看起来像:

user_id | restaurant_id
...     | ...

也就是说,Hibernate/JPA 将在后台创建此联结点 table,以自动存储来自 Userid 值的 id 值之间的关系来自 Restaurant。您 不需要 自己管理。