Search in sources :

Example 1 with InjectToMap

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;
}
Also used : ConnCallback(org.nutz.dao.ConnCallback) NutEntity(org.nutz.dao.impl.entity.NutEntity) Connection(java.sql.Connection) NutMappingField(org.nutz.dao.impl.entity.field.NutMappingField) InjectToMap(org.nutz.lang.inject.InjectToMap) EjectFromMap(org.nutz.lang.eject.EjectFromMap)

Example 2 with InjectToMap

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;
}
Also used : SQLException(java.sql.SQLException) Connection(java.sql.Connection) NutMappingField(org.nutz.dao.impl.entity.field.NutMappingField) InjectToMap(org.nutz.lang.inject.InjectToMap) EjectFromMap(org.nutz.lang.eject.EjectFromMap)

Aggregations

Connection (java.sql.Connection)2 NutMappingField (org.nutz.dao.impl.entity.field.NutMappingField)2 EjectFromMap (org.nutz.lang.eject.EjectFromMap)2 InjectToMap (org.nutz.lang.inject.InjectToMap)2 SQLException (java.sql.SQLException)1 ConnCallback (org.nutz.dao.ConnCallback)1 NutEntity (org.nutz.dao.impl.entity.NutEntity)1