NutzCN Logo
问答 dao insert 使用问题
发布于 2883天前 作者 qq_58832d0b 4920 次浏览 复制 上一个帖子 下一个帖子
标签: dao 版本升级

最近在使用 1.r.58以及最新的1.r.59 , dao.insert(obj) 返回的对象不是插入数据库之后的对象。是否有什么地方不对?
在obj 中的主键 id 是数据库自动分配, 但是执行 insert 之后 我们想要从 insert 返回之后获取 obj 的主键值,发现不是数据库中的主键值,而是在插入之前obj 默认的值。
据此判断dao.insert 返回的实体对象不是插入之后的数据库中实体对象,而是插入之前的实体对象。

对于这种现象明显和 api 文档描述不一致,是否我们在开发中有什么问题没有注意到?
谢谢楼主帮忙解答下!!!!

11 回复

什么数据库,日志也贴一下

mysql
[DEBUG] 11:09:29.055 org.nutz.dao.impl.sql.run.NutDaoExecutor.printSQL(NutDaoExecutor.java:388) - SELECT @INDENTITY
[DEBUG] 11:09:29.074 org.nutz.dao.impl.sql.run.NutDaoExecutor.printSQL(NutDaoExecutor.java:388) - INSERT INTO user(uid,loginName,password,nickName,balance,washBalance,tigerLimit,ticketLimit,returnURL,errorCount,status,isBet,levelId,superiorId,superId,parentPath,barrcode,typeId,source,lastLoginIP,lastLoginDate,lastLogoutDate,GameType,unLiveType,banner,csstext,CREATE_DATETIME,UPDATE_DATETIME,CREATE_BY,UPDATE_BY) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
|---|-------------|----------------------------------|-------------|-----|-----|-----|-----|------|---|---|---|---|-----|---|-----------|------|---|---|------|------|------|---|---|------|------|---------------------|---------------------|-------|-------|
| 0 | 11111111110 | 93da54258735bcd0e8f34ad61581df9b | 11111111110 | 0.0 | 0.0 | 0.0 | 0.0 | NULL | 0 | 0 | 0 | 8 | 570 | 0 | null,570, | NULL | 7 | 0 | NULL | NULL | NULL | 1 | 0 | NULL | NULL | 2016-12-30 11:09:25 | 2016-12-30 11:09:25 | admin | admin |
For example:> "INSERT INTO user(uid,loginName,password,nickName,balance,washBalance,tigerLimit,ticketLimit,returnURL,errorCount,status,isBet,levelId,superiorId,superId,parentPath,barrcode,typeId,source,lastLoginIP,lastLoginDate,lastLogoutDate,GameType,unLiveType,banner,csstext,CREATE_DATETIME,UPDATE_DATETIME,CREATE_BY,UPDATE_BY) VALUES(0,'11111111110','93da54258735bcd0e8f34ad61581df9b','11111111110',0.0,0.0,0.0,0.0,'NULL',0,0,0,8,570,0,'null,570,','NULL',7,0,'NULL','NULL','NULL',1,'0','NULL','NULL','2016-12-30 11:09:25','2016-12-30 11:09:25','admin','admin') "
[DEBUG] 11:09:45.165 org.nutz.dao.impl.sql.run.NutDaoExecutor.printSQL(NutDaoExecutor.java:388) - SELECT * FROM user WHERE loginName=? LIMIT 0, 1
| 1 |
|-------------|
| 11111111110 |

obj 主键值在插入之前是 0, 插入之后 主键值还是0

INSERT INTO user(uid
                 VALUES(0,

uid就是主键???

uid如何声明的, 应该是下面这种形式才对:

@Id
private int uid;

@Column
@Id
@Prev({ @SQL(db = DB.MYSQL, value = "SELECT @@INDENTITY") })
private long uid;

把@Prev去掉.

确实如您所说,问题解决,是什么原因呢?

原因是, 这样写就不对啊... 只是老版本无意中忽略了这种配置...

首先, Prev里面的SQL就不行, 因为@@INDENTITY是插入之后才有值,写成@Next倒是可以, 因为那时候是有值.

然后呢, 之所以之前兼容, 是因为@Id(auto=true) 默认auto=true的时候, 会忽略@Prev.

新版改成了: 如果声明了特定数据库的@Prev,那@Id自动设置为false

代码在org.nutz.dao.impl.entity.AnnotationEntityMaker的488行

            // '@Prev' : 预设值
            if (null != info.annPrev) {
                boolean flag = en.addBeforeInsertMacro(__macro(en.getField(info.name),
                                                _annToFieldMacroInfo(info.annPrev.els(),
                                                                     info.annPrev.value())));
                if (flag && null != info.annId && info.annId.auto()) {
                    log.debugf("Field(%s#%s) autoset as @Id(auto=false)", en.getType().getName(), info.name);
                    ((NutMappingField)en.getField(info.name)).setAutoIncreasement(false);
                }
            }

添加回复
请先登陆
回到顶部