两个问题哈
来源: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回答
-
很详细哦,赞?~给你解答一下。
第一个问题:
建议查看一下你的数据库的主键设计,是不是使用了用户的id作为唯一主键,或者不允许重复。只有这样才会出现上述的问题,如果你检查后无法确定可以给我发一下你的数据库表的Model代码;当然也有可能是你的数据库有脏数据,建议清理数据库后重新创建数据库试试。
第二个问题:
两个写法都是可以的,其根本区别不在于2个方法,而在于缺少了:flush,以及refresh方法操作;这两个操作导致的问题是:第二种写法存储后此时并为写入到数据库,可能只是在缓存中,此时Message中相关的用户信息,主键等字段可能并为自动生成好(也可以理解为数据库中还没有创建对应的字段)如果在后续流程中有依赖这些字段的操作将会出现错误。
所以我们建议存储并且加载一次数据库的最新数据,方便后续流程处理。当然这并不高效,仅仅只是解决了相关问题而已。
022019-02-14
相似问题