V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
shubiao
V2EX  ›  程序员

使用 jpa 为什么不需要显示调用保存关联表操作? 求推荐相关的书/博客等

  •  
  •   shubiao · 8 小时 4 分钟前 · 361 次点击

    有三张表, 分别是 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 的官方文档, 但没找到相应的内容. 官方文档更多是知识点的罗列, 但当我打开真实项目时, 总会发现我有缺少一些隐藏知识(官方团队默认每个人都应该知道的知识)

    6 条回复    2024-12-21 21:15:08 +08:00
    shubiao
        1
    shubiao  
    OP
       7 小时 35 分钟前
    如果有朋友去翻我上个帖子, 我在此回答以下, 外企过了, 以后就要用 jpa 啦, 最近也在学写单测, 有了解外企的代码流程规范之类的也可以在此说一下.

    我知道有朋友会问怎么进的外企, 我也说一下, 其实说白了就是对 xx 外包而已, 就是正常 boss 直聘投简历, 并不是非常高大上 kong, IBM, microsoft 之类的.
    英语呢? 面试看我英语太菜了, 用汉语面试的, 能过只能说是感谢面试官.

    有懂 jpa 的麻烦给解答一下, 万分感谢.
    shubiao
        2
    shubiao  
    OP
       5 小时 6 分钟前
    好像找到端倪了, 应该读 Hibernate 的官方文档才行.

    请有了解的朋友可以聊聊
    siweipancc
        3
    siweipancc  
       4 小时 47 分钟前 via iPhone
    看一下 JPA 文档,这是标准,h 只是实现,spring 是套壳
    blankmiss
        4
    blankmiss  
       3 小时 45 分钟前
    其实我感觉 spring-data-jpa 不是很好用
    Belmode
        5
    Belmode  
       3 小时 26 分钟前
    直接去 spring.io 官网看 SpringData 下面的文档,看完并实践一遍,你就基本懂了。
    awolf
        6
    awolf  
       3 小时 18 分钟前
    不一定对我就知道的说一下欢迎指正 hibernate 有个基础概念,就是 常规的 pojo 要进到 hibernate 的持久化层(你也可以理解是缓存---实际上就是落表 or 表中加载出来)后才叫持久化对象(应该做了动态增强),此时很多行为就有连带性了(引发 select/insert 等)。不一定回答了你的问题,无用请见谅&忽略。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1675 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 16:33 · PVG 00:33 · LAX 08:33 · JFK 11:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.