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

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

  •  
  •   shubiao · 20 小时 57 分钟前 · 612 次点击

    有三张表, 分别是 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 条附言  ·  2 小时 11 分钟前
    破案了, 还是在 entity manage 机制里面, 功能: 检查对象状态变更

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

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

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

    请有了解的朋友可以聊聊
    siweipancc
        3
    siweipancc  
       17 小时 39 分钟前 via iPhone
    看一下 JPA 文档,这是标准,h 只是实现,spring 是套壳
    blankmiss
        4
    blankmiss  
       16 小时 37 分钟前
    其实我感觉 spring-data-jpa 不是很好用
    Belmode
        5
    Belmode  
       16 小时 19 分钟前
    直接去 spring.io 官网看 SpringData 下面的文档,看完并实践一遍,你就基本懂了。
    awolf
        6
    awolf  
       16 小时 10 分钟前
    不一定对我就知道的说一下欢迎指正 hibernate 有个基础概念,就是 常规的 pojo 要进到 hibernate 的持久化层(你也可以理解是缓存---实际上就是落表 or 表中加载出来)后才叫持久化对象(应该做了动态增强),此时很多行为就有连带性了(引发 select/insert 等)。不一定回答了你的问题,无用请见谅&忽略。
    laofan666
        7
    laofan666  
       4 小时 14 分钟前 via iPhone
    for 循环里面把 articletag 关联到 article ,不管加不加事务,save article 都会级联 save articletag ,
    但是你这里是先 save article ,再 for 循环关联 articletag ,没有事务,又不显式 save articletag ,肯定不会自动保存,
    要么加事务,要么显式 save articletag ,
    jpa 有很多黑盒操作,你把那四个注解的每个属性搞清楚,日常开发够用了,其他的坑工作中慢慢填
    shubiao
        8
    shubiao  
    OP
       3 小时 40 分钟前
    @laofan666 请问你说的那四个注解? 我就是想知道这些黑盒操作, 去哪里能学一下?
    我开始看 <hibernate 实战> 这本书了
    1. 看别人的代码, 不对呀, 但运行起来居然是好的
    2. 自己写代码, 写出来的不够优雅(不熟悉 h 的机制)
    shubiao
        9
    shubiao  
    OP
       3 小时 39 分钟前
    @awolf 对的 感谢 我大概了解了一下这个 entity manage 相关的知识
    shubiao
        10
    shubiao  
    OP
       3 小时 37 分钟前
    @siweipancc jpa 文档我也看了, 个人看下来的感觉是: 规定每个注解是什么作用 之类的规范, 这种实现的细节, 怎么使用并没有说
    当然也可能是我看文档后得到的"认识"不对, 请指正
    laofan666
        11
    laofan666  
       2 小时 6 分钟前
    @shubiao #8 one 和 many 的四个组合的注解,
    很多资料和书都是讲怎么用,实现原理得自己翻源码
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2487 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 05:26 · PVG 13:26 · LAX 21:26 · JFK 00:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.