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

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

  •  
  •   shubiao · 4 天前 · 958 次点击

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

    第 1 条附言  ·  3 天前
    破案了, 还是在 entity manage 机制里面, 功能: 检查对象状态变更

    脏检查( Dirty Checking )
    当一个对象从数据库加载到内存时,Hibernate 会在内存中保留一个快照( snapshot )以记录对象在加载时的状态。在事务提交之前,Hibernate 会再次检查对象的当前状态与快照的状态是否有变化,如果有变化,则认为对象是“脏的”( dirty )。Hibernate 将检测到的变化同步到数据库中,以确保与数据库的数据一致性。
    13 条回复    2024-12-23 09:02:44 +08:00
    shubiao
        1
    shubiao  
    OP
       4 天前
    如果有朋友去翻我上个帖子, 我在此回答以下, 外企过了, 以后就要用 jpa 啦, 最近也在学写单测, 有了解外企的代码流程规范之类的也可以在此说一下.

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

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

    请有了解的朋友可以聊聊
    siweipancc
        3
    siweipancc  
       4 天前 via iPhone
    看一下 JPA 文档,这是标准,h 只是实现,spring 是套壳
    blankmiss
        4
    blankmiss  
       4 天前
    其实我感觉 spring-data-jpa 不是很好用
    Belmode
        5
    Belmode  
       4 天前
    直接去 spring.io 官网看 SpringData 下面的文档,看完并实践一遍,你就基本懂了。
    awolf
        6
    awolf  
       4 天前
    不一定对我就知道的说一下欢迎指正 hibernate 有个基础概念,就是 常规的 pojo 要进到 hibernate 的持久化层(你也可以理解是缓存---实际上就是落表 or 表中加载出来)后才叫持久化对象(应该做了动态增强),此时很多行为就有连带性了(引发 select/insert 等)。不一定回答了你的问题,无用请见谅&忽略。
    laofan666
        7
    laofan666  
       3 天前 via iPhone
    for 循环里面把 articletag 关联到 article ,不管加不加事务,save article 都会级联 save articletag ,
    但是你这里是先 save article ,再 for 循环关联 articletag ,没有事务,又不显式 save articletag ,肯定不会自动保存,
    要么加事务,要么显式 save articletag ,
    jpa 有很多黑盒操作,你把那四个注解的每个属性搞清楚,日常开发够用了,其他的坑工作中慢慢填
    shubiao
        8
    shubiao  
    OP
       3 天前
    @laofan666 请问你说的那四个注解? 我就是想知道这些黑盒操作, 去哪里能学一下?
    我开始看 <hibernate 实战> 这本书了
    1. 看别人的代码, 不对呀, 但运行起来居然是好的
    2. 自己写代码, 写出来的不够优雅(不熟悉 h 的机制)
    shubiao
        9
    shubiao  
    OP
       3 天前
    @awolf 对的 感谢 我大概了解了一下这个 entity manage 相关的知识
    shubiao
        10
    shubiao  
    OP
       3 天前
    @siweipancc jpa 文档我也看了, 个人看下来的感觉是: 规定每个注解是什么作用 之类的规范, 这种实现的细节, 怎么使用并没有说
    当然也可能是我看文档后得到的"认识"不对, 请指正
    laofan666
        11
    laofan666  
       3 天前
    @shubiao #8 one 和 many 的四个组合的注解,
    很多资料和书都是讲怎么用,实现原理得自己翻源码
    Nosub
        12
    Nosub  
       3 天前 via iPhone
    阅读《 Java Persistence with Spring Data and Hibernate 》
    https://nosub.net/posts/p/179

    希望对你有帮助。
    shubiao
        13
    shubiao  
    OP
       2 天前
    @Nosub 感谢,
    昨天为了解决这个问题找了两本书, 你推荐的这本和 <Java Persistence with Hibernate>. 目前是为了工作抓紧学 spring data jpa, 空了定会再读你推荐的这本书的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1392 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 17:31 · PVG 01:31 · LAX 09:31 · JFK 12:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.