@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,以自动存储来自 User
和 id
值的 id
值之间的关系来自 Restaurant
。您 不需要 自己管理。
我正在为这个用例寻找最佳映射设计:
我需要做的就是将外键引用存储在@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,以自动存储来自 User
和 id
值的 id
值之间的关系来自 Restaurant
。您 不需要 自己管理。