我正在為這個用例尋找最佳的映射設計:
我需要做的就是將外鍵參考存盤在 @ManyToMany 關系中,但是在 fetch 中,我不關心物件,只關心 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;
表 userFavoriteRestaurants 是一個簡單的兩串列,包含 user_id 和 restaurant_id。
但這不作業。userFavouriteRestaurants 有一個重復的 ManyToMany 交集表 user_favorite_restaurants。
這是要走的路,還是我在罰球線上?我應該只創建一個物體 UserRestaurant 并創建一個帶有 PK 的表,還是這是解決問題的好方法?
如何以優化的方式僅回傳 ID?
獎勵: 假設這種關系會隨著時間的推移而擴展,因此早晚需要 UserRestaurant 物體是否合乎邏輯?
uj5u.com熱心網友回復:
實際上,這@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;
}
物體中@ManyToMany定義的映射User將創建一個連接表,如下所示:
user_id | restaurant_id
... | ...
也就是說,Hibernate/JPA 將在幕后創建這個連接表,以自動存盤id值 fromUser和id值 from之間的關系Restaurant。你不會需要這個管好自己。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/388094.html
