Hibernate查询Movie时movieCategories为空,咨询单向关联能否返回分类列表
嘿,我来帮你解决这个问题~首先得明确说:单向关联完全可以实现查询出带有分类列表的Movie对象,而且说不定比你现在的双向关联配置更简洁。先给你分析下当前双向关联为啥查不到数据,再给你两种可行的单向关联方案:
先说说你当前双向关联的问题
你现在的Movie类里的@OneToMany注解没指定mappedBy属性,Hibernate根本不知道这个关联是由MovieCategory里的movie属性来维护的,所以执行findAll()的时候不会主动去关联查询movie_category表,自然返回的movieCategories是空数组。如果要修复双向关联,其实只要给@OneToMany加上mappedBy="movie"就行,但既然你问单向关联,咱就重点说这个。
方案一:用@ManyToMany实现单向关联(推荐,适合中间表无额外字段)
因为你的movie_category表只是单纯的关联表,没有额外业务字段,完全可以用JPA的@ManyToMany注解直接映射,不用再维护MovieCategory这个实体类,代码更简洁:
修改后的Movie类:
@Entity @Table(name = "movie") @Data public class Movie { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(nullable = false, unique = true) private Integer movieId; // 你的其他影片字段... @ManyToMany(fetch = FetchType.EAGER) @JoinTable( name = "movie_category", // 指定中间表名 joinColumns = @JoinColumn(name = "movieId"), // 当前实体(Movie)在中间表的外键 inverseJoinColumns = @JoinColumn(name = "categoryId") // 关联实体(Category)在中间表的外键 ) private List<Category> categories; // 直接关联分类列表 }
Category类保持你原来的代码不变,MovieCategory实体类可以直接删掉。这时候你调用movieRepository.findAll(),就能直接拿到带有categories列表的Movie对象了。
方案二:保留MovieCategory实体类的单向关联(适合中间表需要扩展字段的情况)
如果以后你要给movie_category表加额外字段(比如关联创建时间、排序权重之类的),那可以保留MovieCategory实体类,改成单向关联:
修改后的Movie类
@Entity @Table(name = "movie") @Data public class Movie { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(nullable = false, unique = true) private Integer movieId; // 你的其他影片字段... @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) @JoinColumn(name = "movieId") // 指定中间表中关联Movie的外键字段 private List<MovieCategory> movieCategories; }
修改后的MovieCategory类
@Entity @Table(name="movie_category") @Data public class MovieCategory { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(nullable = false, unique = true) private Integer movieCategoryId; // 去掉原来的@ManyToOne关联Movie的代码,变成单向从Movie到MovieCategory @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) @JoinColumn(name = "categoryId", referencedColumnName = "categoryId") private Category category; }
这样配置后,查询Movie时Hibernate会自动关联movie_category表,拿到对应的movieCategories列表,每个MovieCategory里又包含对应的Category对象,同样能得到影片的完整分类信息。
内容的提问来源于stack exchange,提问作者Wojciech Abacki

