如何映射实体关系?求指导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
相关产品推荐
相关产品推荐

