有三张表, 分别是 article 表, tag 表, 和他俩的关联表 article_tag, 就是一个简单的保存操作.

public class Article {
    @OneToMany(mappedBy = "article", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private final Set<ArticleTag> articleTags = new HashSet<>();
}
 @Transactional
 public Article save(Article article, Collection<Tag> tags) {
     Article saveArticle = save(article);
     List<Tag> saveTagList = tagJpaRepository.saveAll(tags);
     for (Tag tag : saveTagList) {
         saveArticle.addTag(new ArticleTag(saveArticle, tag));
     }
     return article;
 }

问题 1: 当我不加 @Transactional 时就不会保存到关联表, 加上后在离开该方法时就会触发保存关联表的 sql 执行. 能否给解释一下为什么, 并推荐一些书?

问题 2: 当调用 save(T)方法时, 发现改变的原对象. 所以我没有接收返回值, 当离开该方法时, 就会触发"调用了未持久化对象"异常. 当然, 我也进行了学习 EntityManage 相关的知识, 需要 saveAngFlush(). 但感觉还是不够系统, 有一种雾里看花的感觉

我的情况: 我是一名 Java 老鸟, 但是是 spring jpa(Hibernate) 的初学者, 想了解什么时候应该手动保存? 什么时候可以不接收返回的对象? 我已经读了 spring jpa 的官方文档, 但没找到相应的内容. 官方文档更多是知识点的罗列, 但当我打开真实项目时, 总会发现我有缺少一些隐藏知识(官方团队默认每个人都应该知道的知识)

举报· 413 次点击
登录 注册 站外分享
3 条回复  
siweipancc 初学 昨天 19:46
看一下 JPA 文档,这是标准,h 只是实现,spring 是套壳
shubiao 楼主 小成 昨天 19:26
好像找到端倪了, 应该读 Hibernate 的官方文档才行. 请有了解的朋友可以聊聊
shubiao 楼主 小成 昨天 16:57
如果有朋友去翻我上个帖子, 我在此回答以下, 外企过了, 以后就要用 jpa 啦, 最近也在学写单测, 有了解外企的代码流程规范之类的也可以在此说一下. 我知道有朋友会问怎么进的外企, 我也说一下, 其实说白了就是对 xx 外包而已, 就是正常 boss 直聘投简历, 并不是非常高大上 kong, IBM, microsoft 之类的. 英语呢? 面试看我英语太菜了, 用汉语面试的, 能过只能说是感谢面试官. 有懂 jpa 的麻烦给解答一下, 万分感谢.
返回顶部