【问题标题】:@ManyToMany relationship to store ids only, without any extra columns and references to objects@ManyToMany 关系仅存储 id,没有任何额外的列和对对象的引用
【发布时间】:2022-01-22 13:11:52
【问题描述】:

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

我需要做的就是将外键引用存储在@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;

表格 userFavoriteRestaurants 是一个简单的两列表格,包含 user_id 和 restaurant_id。

工作。 userFavouriteRestaurants 有一个重复的 ManyToMany 交集表 user_favorite_restaurants。

这是要走的路吗,还是我在下线? 我应该只创建一个实体 UserRestaurant 并使用 PK 创建一个表,还是这是解决问题的好方法?

如何以优化的方式仅返回 id?

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

【问题讨论】:

  • 如果您对 Hibernate 仍有其他疑问/问题,请随时搜索 SO 或提出其他问题 :-)

标签: hibernate jpa hibernate-mapping


【解决方案1】:

实际上,两个实体中的@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 表,如下所示:

user_id | restaurant_id
...     | ...

也就是说,Hibernate/JPA 将在后台创建此联结表,以自动存储来自Userid 值和来自Restaurantid 值之间的关系。你确实不需要自己管理这个。

【讨论】:

  • 好的,但我这样做是为了轻松地只获取一组 ID,而不需要整个对象。如何创建 Id 的 HashSet?遍历每条记录并添加 id?这是优化的方式吗?
  • 不确定您还需要什么,但这听起来像是一个不同的问题。
  • 我认为这是相关的,因为在您的解决方案中,我将在获取 Json 时收到其中的整个对象,而不仅仅是一组外键。
  • @camel38 也许你对如何使用 Hibernate 有一些困惑。通常,Hibernate/JPA 中的工作单元是 entity(即 Java 对象),而不是主键或外键。如果您确实需要直接使用 PK/FK,您可以使用 getter 访问它们,但大多数时候您可能不需要。
  • 我明白了,我正在寻找一些 hibernate 不适合做的事情。谢谢蒂姆!
猜你喜欢
  • 2019-03-09
  • 2019-10-16
  • 2013-09-24
  • 2014-09-30
  • 1970-01-01
  • 2016-09-27
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多