You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何映射实体关系?求指导Rating与User、Movie的关联配置

JPA 实体关联映射方案

根据你的业务场景,User和Movie是多对多关系,而Rating作为承载评分数据的关联实体(自身包含独立属性rating和主键id),需要分别与User、Movie建立多对一的关联关系,具体注解配置如下:

1. Rating 实体完整代码

@Entity
public class Rating {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 建议添加主键生成策略,避免手动赋值
    private long id;

    private String rating;

    // 与User的多对一关联
    @ManyToOne(fetch = FetchType.LAZY) // 懒加载优化性能,按需加载关联对象
    @JoinColumn(name = "user_id", nullable = false) // 指定外键字段名,添加非空约束
    private User user;

    // 与Movie的多对一关联
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "movie_id", nullable = false)
    private Movie movie;

    // 构造方法、getter/setter 省略
}

2. 补充User和Movie实体的关联配置(可选,用于双向查询)

如果需要从User或Movie端反向查询所有评分记录,可以在对应实体中添加一对多关联:

User 实体

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private String name;

    // 一对多关联Rating,mappedBy指定Rating中对应的属性名
    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Rating> ratings = new ArrayList<>();

    // 构造方法、getter/setter 省略
}

Movie 实体

@Entity
public class Movie {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private String movieName;
    private String description;

    @OneToMany(mappedBy = "movie", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Rating> ratings = new ArrayList<>();

    // 构造方法、getter/setter 省略
}

关键说明

  • @ManyToOne:表示多个Rating对应一个User/Movie,匹配"一个用户可给多部电影评分,一部电影可被多个用户评分"的业务逻辑。
  • @JoinColumn:显式指定数据库外键字段名,避免JPA自动生成的默认名称不直观。
  • fetch = FetchType.LAZY:懒加载模式,仅当调用rating.getUser()或rating.getMovie()时才查询关联对象,提升查询性能。
  • 双向关联中的mappedBy:指定关联关系由Rating端维护,避免重复生成外键;cascade = CascadeType.ALL可实现评分数据与用户/电影的级联操作(如删除用户时同时删除其所有评分)。

内容的提问来源于stack exchange,提问作者rg04

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 16:39:21