首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >保存具有缓存对象的实体会导致分离实体异常。

保存具有缓存对象的实体会导致分离实体异常。
EN

Stack Overflow用户
提问于 2017-11-07 01:36:07
回答 1查看 1K关注 0票数 2

我试图使用Spring /(.save)在DB中保存一个实体,其中包含通过@Cache方法加载的另一个实体。换句话说,我试图保存一个包含属性实体的Ad实体,这些属性是使用Spring @Cache加载的。

正因为如此,我让一个独立的实体被传递给持久化异常。

我的问题是,是否有一种方法可以保存仍然使用@Cache作为属性的实体?

我查了一下,但找不到任何做同样事情的人,特别是知道我使用的CrudRepository只有.save()方法,据我所知,它管理持久化、更新、合并等。

任何帮助都是非常感谢的。

提前谢谢。

Ad.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Entity
@DynamicInsert
@DynamicUpdate
@Table(name = "ad")
public class Ad implements SearchableAdDefinition {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    private User user;

    @OneToMany(mappedBy = "ad", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private Set<AdAttribute> adAttributes;

(.....) }

AdAttribute.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Entity
@Table(name = "attrib_ad")
@IdClass(CompositeAdAttributePk.class)
public class AdAttribute {

    @Id
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ad_id")
    private Ad ad;

    @Id
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "attrib_id")
    private Attribute attribute;

    @Column(name = "value", length = 75)
    private String value;

    public Ad getAd() {
        return ad;
    }

    public void setAd(Ad ad) {
        this.ad = ad;
    }

    public Attribute getAttribute() {
        return attribute;
    }

    public void setAttribute(Attribute attribute) {
        this.attribute = attribute;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}


@Embeddable
 class CompositeAdAttributePk implements Serializable {
    private Ad ad;
    private Attribute attribute;

    public CompositeAdAttributePk() {

    }

    public CompositeAdAttributePk(Ad ad, Attribute attribute) {
        this.ad = ad;
        this.attribute = attribute;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        CompositeAdAttributePk compositeAdAttributePk = (CompositeAdAttributePk) o;
        return ad.getId().equals(compositeAdAttributePk.ad.getId()) && attribute.getId().equals(compositeAdAttributePk.attribute.getId());

    }

    @Override
    public int hashCode() {
        return Objects.hash(ad.getId(), attribute.getId());
    }

}

方法用于加载属性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Cacheable(value = "requiredAttributePerCategory", key = "#category.id")
public List<CategoryAttribute> findRequiredCategoryAttributesByCategory(Category category) {

    return categoryAttributeRepository.findCategoryAttributesByCategoryAndAttribute_Required(category, 1);
}

方法用于创建/持久化Ad:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Transactional
public Ad create(String title, User user, Category category, AdStatus status, String description, String url, Double price, AdPriceType priceType, Integer photoCount, Double minimumBid, Integer options, Importer importer, Set<AdAttribute> adAtributes) {
    //Assert.notNull(title, "Ad title must not be null");

    Ad ad = adCreationService.createAd(title, user, category, status, description, url, price, priceType, photoCount, minimumBid, options, importer, adAtributes);

    for (AdAttribute adAttribute : ad.getAdAttributes()) {
        adAttribute.setAd(ad);

/* If I add this here, I don't face any exception, but then I don't take benefit from using cache:
        Attribute attribute = attributeRepository.findById(adAttribute.getAttribute().getId()).get();
        adAttribute.setAttribute(attribute);
*/

    }

    ad = adRepository.save(ad);

    solrAdDocumentRepository.save(AdDocument.adDocumentBuilder(ad));

    return ad;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-16 23:40:07

我不知道你是否还需要这个答案,因为这是很长的时间,你问了这个问题。然而,我将把我的意见留在这里,其他人可能会从中得到帮助。

假设您从应用程序的其他部分调用了您的findRequiredCategoryAttributesByCategory方法。Spring将首先在缓存中检查,然后什么也找不到。然后,它将尝试从数据库中获取它。因此,它将创建一个hibernate会话,打开一个事务,获取数据,关闭事务和会话。最后,从函数返回后,它将将结果集存储在缓存中,以供以后使用。

您必须记住,当前缓存中的这些值是使用hibernate会话获取的,该会话现在已关闭。因此,它们与任何会话无关,现在处于分离状态。

现在,您正在尝试保存和Ad实体。为此,spring创建了一个新的hibernate会话,Ad实体被附加到这个特定的会话中。但是从缓存中获取的attributes对象是分离的。这就是为什么当您试图持久化Ad实体时,您得到的是分离的实体异常

要解决这个问题,您需要将这些对象重新附加到当前的hibernate会话中,我使用merge()方法进行此操作。来自hibernate文档,这里是https://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/Session.html

将给定对象的状态复制到具有相同标识符的持久对象上。如果当前没有与会话相关联的持久实例,则将加载该实例。返回持久实例。如果未保存给定实例,请保存该实例的副本并将其作为新的持久实例返回。给定实例不会与会话关联。如果关联与cascade=“合并”映射,此操作将级联到关联实例。

简单地说,这将将对象附加到hibernate会话。在调用findRequiredCategoryAttributesByCategory方法之后,您应该做什么,编写如下内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List attributesFromCache = someService.findRequiredCategoryAttributesByCategory();
List attributesAttached = entityManager.merge( attributesFromCache );

现在将attributesAttached设置为Ad对象。这不会引发异常,因为属性列表现在是当前Hibernate会话的一部分。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47154380

复制
相关文章
免费无限使用谷歌搜索,完美安排
在这广告满天飞的搜索引擎中,其实我是拒绝的也很少用上面说到的,因为我一直在用谷歌搜索引擎。
IT小侠公社
2019/06/12
8.7K1
免费无限使用谷歌搜索,完美安排
[翻译]Pexels免费图片API文档
如果贵司想请求我们的API, 你可以从这里获取Key. 我们很期待听到你的创意! 获取更到信息可以在API预览页 或 继续阅读来了解我们的API 如何工作的以及如何集成它.
治电小白菜
2020/08/25
4.6K0
Vercel: 免费托管你的 API 服务
Vercel,官网 https://vercel.com (opens new window)[1],如同 Netlify 一般,可以提供免费的前端应用托管,甚至对开发者更加亲和与友好。
山月
2020/12/16
8.3K0
Vercel: 免费托管你的 API 服务
后台回忆页专辑图片陈列
今天主要完成的是后端图片上传功能的进一步完善以及后台回忆页面的初步成列。 后端图片上传完善 昨天的图片上传,忽略了一个比较严重的功能,那就是更新相册的图片计数。 今天则把该功能实现了,因为该功能的操作与返回结果无关, 所以采用开启新的线程进行单独处理,从而提升用户体验,后台慢慢更新。 new Thread(() ->; { Integer count = imageDao.countImg(aid); Integer updateCode = albumDao.updateAlbum(new Al
时光潜流
2022/12/26
2310
【Origin教程】origin 检查是否有重复图片
origin 检查是否有重复图片 最近在写论文,当在画图的时候有很多个子图,但是sub-problems太多了,原始数据生成的表格特别多,眼花缭乱。 有时候用origin在一个项目中画出了一组图,很容易在复制粘贴的时候搞错,例如将表1对应生成了图2和图3两张图片而浑然不自知。 针对这种状况,我们可以随意点开已经画好的图片,双击其图片的区域,找到底部的workbook,通过不断翻看每个workbook对应生成的图片可以观察到是否有同一个wordbook对应了多个图片 例如:在这个实例中可以看到VM11这
演化计算与人工智能
2022/01/24
1.7K0
【Origin教程】origin 检查是否有重复图片
人脸融合是否有接口自己上传素材图片?
人脸融合是否有接口自己上传素材图片?有没有大佬告诉我下下,我没找到啊!!!凑下字数123456798123456789123467891324567891234567891324567891234567891234567891234567891212345679812345678912346789132456789123456789132456789123456789123456789123456789123
用户3711132
2020/04/28
1.3K0
文曦API--稳定、快速、免费的 API 接口服务
这个接口程序用的是别人的接口程序,接口的话大部分属于自己添加,还有一个自己开发的接口,包括QQ好(实名/成年)查询、随机二次元图片、舔狗语录、一言、二维码生成、获取QQ昵称和头像、文案(温柔)、网易云音乐解析、getip(获取客户端IP),后续也将继续为大家添加更多的接口,欢迎大家使用。
雾海梦曦
2022/11/04
1.1K0
文曦API--稳定、快速、免费的 API 接口服务
免费的图片网络存储服务器
特殊说明: 解决问题的光鲜,藏着磕Bug的痛苦。 万物皆入轮回,谁也躲不掉! 以上文章,均是我实际操作,写出来的笔记资料,不会出现全文盗用别人文章!烦请各位,请勿直接盗用!
收心
2022/01/19
12.3K0
免费的图片网络存储服务器
有哪些免费的方法能将PDF导出成JPG图片?
根据不同的应用场合,有时需要将PDF文件导出成图片使用,有哪些能够免费将PDF转成JPG的方法呢?下面分享两种方法你一定用的上。
全栈程序员站长
2022/08/28
2.3K0
有哪些免费的方法能将PDF导出成JPG图片?
腾讯云 移动直播SDK 是否有踢出观众的API?
如题:腾讯云 移动直播SDK 是否有踢出观众的API?或者禁言该观众,有些观众发表一些不当言论需要移出出直播间,请问有没有这方面的API方法?求技术大神解答,看了官方的文档也没有发现有类似的方法,还是说这个功能是企业版的功能?请腾讯的技术大哥们给点帮助,辛苦谢谢了!如果没有类似的功能,请问有相关的开发计划么?
用户1573125
2020/03/09
7.5K0
【数据】常用API接口汇总
下面列举了100多个国内常用API接口,并按照 笔记、出行、词典、电商、地图、电影、即时通讯、开发者网站、快递查询、旅游、社交、视频、天气、团队协作、图片与图像处理、外卖、消息推送、音乐、云、语义识别、语音识别、杂志、综合 进行了如下分类。 笔记 OneNote - OneNote支持获取,复制,创建,更新,导入与导出笔记,支持为笔记添加多媒体内容,管理权限等。提供SDK和Demo。 为知笔记 - 为知笔记Windows客户端开放了大量的API,其中绝大部分,都通过COM提供,可以在javascript,
陆勤_数据人网
2018/04/18
19.9K1
【大数据分析必备】超全国内常用API接口汇总
下面列举了100多个国内常用API接口,并按照 笔记、出行、词典、电商、地图、电影、即时通讯、开发者网站、快递查询、旅游、社交、视频、天气、团队协作、图片与图像处理、外卖、消息推送、音乐、云、语义识别、语音识别、杂志、综合 进行了如下分类。
IT派
2018/07/30
12.2K1
javascript图片无限懒加载
知识点:for循环语句,DOM概念,元素获取,动态布局,基本算法,节点操作,JQ与JS的关系与区别,JS的重要性,如何学习JS。 html代码: <div id="box"><!--id="自定义的名称" 命名规范(见名知义:用有语义的英文单词)--> <ul><!--无序列表标签--> <!--img图片四要素:src width height alt(解释说明)--> <li></li> <li></li>
IT架构圈
2018/06/01
1.7K0
查看zookeeper注册中心是否有注册服务
查看zookeeper注册中心是否有注册服务可以在服务器上看,也可以在dubboadmin看哦~
MonroeCode
2018/01/10
21.7K1
免费提供sky交流测试,批量测试chatGPT的api是否还能用2023.6.6
0、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
用户7138673
2023/08/16
3440
免费提供sky交流测试,批量测试chatGPT的api是否还能用2023.6.6
查看zookeeper注册中心是否有注册服务
查看zookeeper注册中心是否有注册服务可以在服务器上看,也可以在dubboadmin看哦~ 1.在服务器上看: 1)查找zookeeper的目录; find / -name zookeeper 2)进入zookeeper的bin目录; /data/opt/src/zookeeper-3.4.9/bin 3)执行zkcli.sh命令,如图1; ./zkCli.sh 4)查看有哪些zookeeper节点; ls / 5)查看注册了哪些服务,如图2; ls /daily_orderServer_group(
MonroeCode
2018/02/09
2.1K0
查看zookeeper注册中心是否有注册服务
查看zookeeper注册中心是否有注册服务
查看zookeeper注册中心是否有注册服务可以在服务器上看,也可以在dubboadmin看哦~
MonroeCode
2018/01/09
3.9K0
腾讯网关api有什么作用 api对于微服务有什么益处?
api网关如今在各种大型微服务结构系统当中作用非同小可。尤其是一些大型的微服务架构当中,更需要api网关来保驾护航。越是大型的微服务架构,越是程序繁杂,所需的功能模块更加多种多样,访问流量用户巨大,因此系统所存在的压力也可想而知。众所周知,腾讯是一个大型的互联网平台,腾讯网关api有什么作用呢?
用户8715145
2021/12/22
6100
检查图片是否损坏、图片后缀是否与实际图片类型对应 - Python
日常工作中,时常会需要用到图片,有时候图片在下载、解压过程中会损坏,而如果一张一张点击来检查就太不Cool了,因此我想大家都需要一个检查脚本;
HoLoong
2020/09/21
3.3K0
检查图片是否损坏、图片后缀是否与实际图片类型对应 - Python
jq 判断是否有图片,如有给父级添加class
<div> <p><img src="eisregen.jpg" /></p> <p>12313131313</p> <p><img src="" /></p> </div> <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script> <script> $(document).ready(function() { $("img").each(function() { if($(this).attr("src"
Savalone
2020/06/23
1.6K0

相似问题

android的免费专辑艺术API?

13

音乐信息(专辑、艺术家、曲目)是否有免费的数据库或web服务api?

52

是否有免费的国际时区API?

33

是否有免费的API管理系统?

234

Google产品搜索是否有Web服务API?

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文