有三张表, 分别是 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 4 小时 47 分钟前 via iPhone
看一下 JPA 文档,这是标准,h 只是实现,spring 是套壳
|
4
blankmiss 3 小时 45 分钟前
其实我感觉 spring-data-jpa 不是很好用
|
6
awolf 3 小时 18 分钟前
不一定对我就知道的说一下欢迎指正 hibernate 有个基础概念,就是 常规的 pojo 要进到 hibernate 的持久化层(你也可以理解是缓存---实际上就是落表 or 表中加载出来)后才叫持久化对象(应该做了动态增强),此时很多行为就有连带性了(引发 select/insert 等)。不一定回答了你的问题,无用请见谅&忽略。
|