浏览代码

Merge branch 'master' into jfinal-java8

James 8 年之前
父节点
当前提交
11e3da9e68

+ 19 - 0
src/main/java/com/jfinal/plugin/activerecord/dialect/Dialect.java

@@ -16,6 +16,7 @@
 
 package com.jfinal.plugin.activerecord.dialect;
 
+import java.math.BigInteger;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
@@ -92,6 +93,8 @@ public abstract class Dialect {
 							model.set(pKey, rs.getInt(1));
 						} else if (colType == Long.class || colType == long.class) {
 							model.set(pKey, rs.getLong(1));
+						} else if (colType == BigInteger.class) {
+							processGeneratedBigIntegerKey(model, pKey, rs.getObject(1));
 						} else {
 							model.set(pKey, rs.getObject(1));	// It returns Long for int colType for mysql
 						}
@@ -103,6 +106,22 @@ public abstract class Dialect {
 	}
 	
 	/**
+	 * mysql 数据库的  bigint unsigned 对应的 java 类型为 BigInteger
+	 * 但是 rs.getObject(1) 返回值为 Long 型,造成 model.save() 以后
+	 * model.getId() 时的类型转换异常 
+	 */
+	protected void processGeneratedBigIntegerKey(Model<?> model, String pKey, Object v) {
+		if (v instanceof BigInteger) {
+			model.set(pKey, (BigInteger)v);
+		} else if (v instanceof Number) {
+			Number n = (Number)v;
+			model.set(pKey, BigInteger.valueOf(n.longValue()));
+		} else {
+			model.set(pKey, v);
+		}
+	}
+	
+	/**
 	 * 用于获取 Db.save(tableName, record) 以后自动生成的主键值,可通过覆盖此方法实现更精细的控制
 	 * 目前只有 PostgreSqlDialect,覆盖过此方法
 	 */

+ 3 - 0
src/main/java/com/jfinal/plugin/activerecord/dialect/PostgreSqlDialect.java

@@ -16,6 +16,7 @@
 
 package com.jfinal.plugin.activerecord.dialect;
 
+import java.math.BigInteger;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -227,6 +228,8 @@ public class PostgreSqlDialect extends Dialect {
 							model.set(pKey, rs.getInt(pKey));
 						} else if (colType == Long.class || colType == long.class) {
 							model.set(pKey, rs.getLong(pKey));
+						} else if (colType == BigInteger.class) {
+							processGeneratedBigIntegerKey(model, pKey, rs.getObject(pKey));
 						} else {
 							model.set(pKey, rs.getObject(pKey));
 						}