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

2024 年 12 月 21 日
 shubiao

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

2245 次点击
所在节点    程序员
13 条回复
shubiao
2024 年 12 月 21 日
如果有朋友去翻我上个帖子, 我在此回答以下, 外企过了, 以后就要用 jpa 啦, 最近也在学写单测, 有了解外企的代码流程规范之类的也可以在此说一下.

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

有懂 jpa 的麻烦给解答一下, 万分感谢.
shubiao
2024 年 12 月 21 日
好像找到端倪了, 应该读 Hibernate 的官方文档才行.

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

希望对你有帮助。
shubiao
2024 年 12 月 23 日
@Nosub 感谢,
昨天为了解决这个问题找了两本书, 你推荐的这本和 <Java Persistence with Hibernate>. 目前是为了工作抓紧学 spring data jpa, 空了定会再读你推荐的这本书的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1099287

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX