两个问题哈

来源:8-4 客户端数据流封装-统一的写入-3

慕用1394343

2019-02-13


就是 当我保存消息表的时候 发起人是A接收人是B, 当我Message表中没数据的时候,第一次save(message)没有问题 ,但是当第二次sava()的时候 他就报错A different object with the same identifier value was already associated with the session : [com.qingge.post.bean.db.User#428c08cf-6010-410f-99d7-5c9e297c63bf] 我查后说是标识符相同的问题 当我把发送人 接收人都换了的时候 他还是报这个错误 只是com.qingge.post.bean.db.User#xxx 换了个而已. 网上的什么session.clear(),还是session.merge(),都没用 .


就是请问下老师这个有什么区别

// 添加一条普通消息
    public static Message add(User sender, User receiver, MessageCreateModel model) {
        Message message = new Message(sender, receiver, model);
        return save(message);
    }
    
    private static Message save(Message message) {
        return Hib.query(session -> {
            session.save(message);

            // 写入到数据库
            session.flush();

            // 紧接着从数据库中查询出来
            session.refresh(message);
            return message;
        });
    }

上面的保存操作为什么不在add方法里面直接 像下面这样呢?

public static Message add(User sender, User receiver, MessageCreateModel model) {
        Message message = new Message(sender, receiver, model);
        return Hib.query(session -> {
            session.save(message);
            return message;
        });
    }

写回答

1回答

Qiujuer

2019-02-13

很详细哦,赞?~给你解答一下。

第一个问题:

建议查看一下你的数据库的主键设计,是不是使用了用户的id作为唯一主键,或者不允许重复。只有这样才会出现上述的问题,如果你检查后无法确定可以给我发一下你的数据库表的Model代码;当然也有可能是你的数据库有脏数据,建议清理数据库后重新创建数据库试试。


第二个问题:

两个写法都是可以的,其根本区别不在于2个方法,而在于缺少了:flush,以及refresh方法操作;这两个操作导致的问题是:第二种写法存储后此时并为写入到数据库,可能只是在缓存中,此时Message中相关的用户信息,主键等字段可能并为自动生成好(也可以理解为数据库中还没有创建对应的字段)如果在后续流程中有依赖这些字段的操作将会出现错误。


所以我们建议存储并且加载一次数据库的最新数据,方便后续流程处理。当然这并不高效,仅仅只是解决了相关问题而已。

0
2
Qiujuer
回复
慕用1394343
ok的
2019-02-14
共2条回复

手把手开发完整的即时通讯App 客户端+服务端+MVP架构

客户端+服务端+MVP架构+封装思想+主流框架

1755 学习 · 874 问题

查看课程