use of org.nutz.lang.inject.InjectToMap in project nutz by nutzam.
the class EntityHolder method makeEntity.
@SuppressWarnings({ "rawtypes", "unchecked" })
public <T extends Map<String, ?>> Entity<T> makeEntity(String tableName, T map) {
final NutEntity<T> en = new NutEntity(map.getClass());
en.setTableName(tableName);
en.setViewName(tableName);
boolean check = false;
for (Entry<String, ?> entry : map.entrySet()) {
String key = entry.getKey();
// 是实体补充描述吗?
if (key.startsWith("#")) {
en.getMetas().put(key.substring(1), entry.getValue().toString());
continue;
} else // 以 "." 开头的字段,不是实体字段
if (key.startsWith(".")) {
continue;
}
// 是实体字段
Object value = entry.getValue();
Mirror<?> mirror = Mirror.me(value);
NutMappingField ef = new NutMappingField(en);
if (key.startsWith("+")) {
ef.setAsAutoIncreasement();
if (mirror != null && mirror.isIntLike())
ef.setAsId();
key = key.substring(1);
}
if (key.startsWith("!")) {
ef.setAsNotNull();
key = key.substring(1);
}
if (key.startsWith("*")) {
key = key.substring(1);
if (mirror != null && mirror.isIntLike())
ef.setAsId();
else
ef.setAsName();
}
ef.setName(key);
ef.setType(null == value ? Object.class : value.getClass());
ef.setColumnName(key);
// 猜测一下数据库类型
Jdbcs.guessEntityFieldColumnType(ef);
ef.setAdaptor(expert.getAdaptor(ef));
if (mirror != null)
ef.setType(mirror.getType());
// 这里比较纠结,回设的时候应该用什么呢?
ef.setInjecting(new InjectToMap(key));
ef.setEjecting(new EjectFromMap(entry.getKey()));
if (ef.isAutoIncreasement() && ef.isId() && expert.isSupportAutoIncrement() && !expert.isSupportGeneratedKeys()) {
en.addAfterInsertMacro(expert.fetchPojoId(en, ef));
}
en.addMappingField(ef);
if (mirror != null && !check)
check = mirror.isEnum();
}
en.checkCompositeFields(null);
// 最后在数据库中验证一下实体各个字段
if (check)
connCallback.invoke(new ConnCallback() {
public void invoke(Connection conn) throws Exception {
expert.setupEntityField(conn, en);
}
});
// 搞定返回
return en;
}
use of org.nutz.lang.inject.InjectToMap in project nutz by nutzam.
the class MapEntityMaker method make.
@SuppressWarnings({ "unchecked", "rawtypes" })
public <T extends Map<String, ?>> Entity<T> make(String tableName, T map) {
final NutEntity<T> en = new NutEntity(map.getClass());
en.setTableName(tableName);
en.setViewName(tableName);
boolean check = false;
for (Entry<String, ?> entry : map.entrySet()) {
String key = entry.getKey();
// 是实体补充描述吗?
if (key.startsWith("#")) {
en.getMetas().put(key.substring(1), entry.getValue().toString());
continue;
} else // 以 "." 开头的字段,不是实体字段
if (key.startsWith(".")) {
continue;
}
// 是实体字段
Object value = entry.getValue();
Mirror<?> mirror = Mirror.me(value);
NutMappingField ef = new NutMappingField(en);
while (true) {
if (key.startsWith("+")) {
ef.setAsAutoIncreasement();
if (mirror != null && mirror.isIntLike())
ef.setAsId();
key = key.substring(1);
} else if (key.startsWith("!")) {
ef.setAsNotNull();
key = key.substring(1);
} else if (key.startsWith("*")) {
key = key.substring(1);
if (mirror != null && mirror.isIntLike())
ef.setAsId();
else
ef.setAsName();
} else {
break;
}
}
ef.setName(key);
String columnName = key;
// 强制大写?
if (Daos.FORCE_UPPER_COLUMN_NAME) {
ef.setColumnName(columnName.toUpperCase());
} else {
ef.setColumnName(columnName);
}
// 强制包裹?
if (Daos.FORCE_WRAP_COLUMN_NAME) {
ef.setColumnNameInSql(expert.wrapKeyword(columnName, true));
} else if (Daos.CHECK_COLUMN_NAME_KEYWORD) {
ef.setColumnNameInSql(expert.wrapKeyword(columnName, false));
}
// 类型是啥呢?
if (map.containsKey("." + key + ".type")) {
ef.setType((Class) map.get("." + key + ".type"));
} else {
ef.setType(null == value ? Object.class : value.getClass());
}
// ColType是啥呢?
if (map.containsKey("." + key + ".coltype")) {
ef.setColumnType((ColType) map.get("." + key + ".coltype"));
} else {
// 猜测一下数据库类型
Jdbcs.guessEntityFieldColumnType(ef);
}
// 适配器类型是啥呢?
if (map.containsKey("." + key + ".adaptor")) {
ef.setAdaptor((ValueAdaptor) map.get("." + key + ".adaptor"));
} else {
ef.setAdaptor(expert.getAdaptor(ef));
}
// 字段长度是多少呢
if (map.containsKey("." + key + ".width")) {
Object w = map.get("." + key + ".width");
if (null != w && (w instanceof Integer)) {
ef.setWidth((Integer) w);
}
}
// 这里比较纠结,回设的时候应该用什么呢?
ef.setInjecting(new InjectToMap(key));
ef.setEjecting(new EjectFromMap(entry.getKey()));
if (ef.isAutoIncreasement() && ef.isId() && expert.isSupportAutoIncrement() && !expert.isSupportGeneratedKeys()) {
en.addAfterInsertMacro(expert.fetchPojoId(en, ef));
}
en.addMappingField(ef);
if (mirror != null && !check)
check = mirror.isEnum();
}
en.checkCompositeFields(null);
// 最后在数据库中验证一下实体各个字段
if (check) {
Connection conn = null;
try {
try {
conn = dataSource.getConnection();
expert.setupEntityField(conn, en);
} finally {
if (conn != null)
conn.close();
}
} catch (SQLException e) {
log.debug(e.getMessage(), e);
}
}
// 搞定返回
return en;
}
Aggregations