Spring Boot(JHipster) JPA单向ManyToMany关联数据未写入关联表问题
故障排查及修复方案
1. 核心问题:只读事务禁止数据修改
你在FilmService的addToFavorites方法上标注了@Transactional(readOnly = true),该配置会声明当前事务为只读模式,Spring会禁止所有数据写入操作,自然无法向关联表插入数据,这是问题的直接诱因。
修复方式:修改事务注解为可写模式:
// 移除readOnly = true属性 @Transactional public Optional<FilmDTO> addToFavorites(Long id) { // 原有业务逻辑保持不变 }
2. 关联级联配置补充
你当前User实体的多对多关联仅配置了CascadeType.PERSIST,该规则仅在首次保存新的User实体时同步关联的Film数据。当你修改已存在的用户的收藏列表时,底层调用的是merge操作,需要补充MERGE级联才能同步更新关联表数据:
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinTable( name = "user_film_favorite", joinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "movie_id", referencedColumnName = "id") } ) @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) @BatchSize(size = 20) private List<Film> favorites = new ArrayList<>();
3. 可选校验:确认UserService.save的事务配置
如果UserService的save方法没有配置@Transactional注解,建议补充该配置,避免父方法事务失效时无法持久化修改:
@Transactional public User save(User user) { log.debug("Request to save User : {}", user); return userRepository.save(user); }
完成以上修改后,再执行添加收藏操作即可正常生成关联表数据。
内容的提问来源于stack exchange,提问作者lysenn
相关产品推荐
相关产品推荐

