有三张表, 分别是 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
shubiao OP 如果有朋友去翻我上个帖子, 我在此回答以下, 外企过了, 以后就要用 jpa 啦, 最近也在学写单测, 有了解外企的代码流程规范之类的也可以在此说一下.
我知道有朋友会问怎么进的外企, 我也说一下, 其实说白了就是对 xx 外包而已, 就是正常 boss 直聘投简历, 并不是非常高大上 kong, IBM, microsoft 之类的. 英语呢? 面试看我英语太菜了, 用汉语面试的, 能过只能说是感谢面试官. 有懂 jpa 的麻烦给解答一下, 万分感谢. |
2
shubiao OP 好像找到端倪了, 应该读 Hibernate 的官方文档才行.
请有了解的朋友可以聊聊 |
3
siweipancc 14 小时 14 分钟前 via iPhone
看一下 JPA 文档,这是标准,h 只是实现,spring 是套壳
|
4
blankmiss 13 小时 12 分钟前
其实我感觉 spring-data-jpa 不是很好用
|
6
awolf 12 小时 45 分钟前
不一定对我就知道的说一下欢迎指正 hibernate 有个基础概念,就是 常规的 pojo 要进到 hibernate 的持久化层(你也可以理解是缓存---实际上就是落表 or 表中加载出来)后才叫持久化对象(应该做了动态增强),此时很多行为就有连带性了(引发 select/insert 等)。不一定回答了你的问题,无用请见谅&忽略。
|
7
laofan666 49 分钟前 via iPhone
for 循环里面把 articletag 关联到 article ,不管加不加事务,save article 都会级联 save articletag ,
但是你这里是先 save article ,再 for 循环关联 articletag ,没有事务,又不显式 save articletag ,肯定不会自动保存, 要么加事务,要么显式 save articletag , jpa 有很多黑盒操作,你把那四个注解的每个属性搞清楚,日常开发够用了,其他的坑工作中慢慢填 |
8
shubiao OP @laofan666 请问你说的那四个注解? 我就是想知道这些黑盒操作, 去哪里能学一下?
我开始看 <hibernate 实战> 这本书了 1. 看别人的代码, 不对呀, 但运行起来居然是好的 2. 自己写代码, 写出来的不够优雅(不熟悉 h 的机制) |
10
shubiao OP @siweipancc jpa 文档我也看了, 个人看下来的感觉是: 规定每个注解是什么作用 之类的规范, 这种实现的细节, 怎么使用并没有说
当然也可能是我看文档后得到的"认识"不对, 请指正 |