Search in sources :

Example 1 with One

use of org.nutz.dao.entity.annotation.One in project nutz by nutzam.

the class AnnotationEntityMaker method make.

public <T> Entity<T> make(Class<T> type) {
    NutEntity<T> en = _createNutEntity(type);
    TableInfo ti = _createTableInfo(type);
    // 全局
    if (null != expert.getConf()) {
        for (String key : expert.getConf().keySet()) en.getMetas().put(key, expert.getConf().get(key));
    }
    // 当前表
    if (null != ti.annMeta) {
        Map<String, Object> map = Lang.map(ti.annMeta.value());
        for (Entry<String, Object> entry : map.entrySet()) {
            en.getMetas().put(entry.getKey(), entry.getValue().toString());
        }
    }
    /*
         * 获得表名以及视图名称及注释
         */
    String tableName = null;
    if (null == ti.annTable) {
        tableName = Daos.getTableNameMaker().make(type);
        if (null == ti.annView)
            log.warnf("No @Table found, fallback to use table name='%s' for type '%s'", tableName, type.getName());
    } else {
        tableName = ti.annTable.value().isEmpty() ? Daos.getTableNameMaker().make(type) : ti.annTable.value();
        if (!ti.annTable.prefix().isEmpty()) {
            tableName = ti.annTable.prefix() + tableName;
        }
        if (!ti.annTable.suffix().isEmpty()) {
            tableName = tableName + ti.annTable.suffix();
        }
    }
    String viewName = null;
    if (null == ti.annView) {
        viewName = tableName;
    } else {
        viewName = ti.annView.value().isEmpty() ? Daos.getViewNameMaker().make(type) : ti.annView.value();
        if (!ti.annView.prefix().isEmpty()) {
            viewName = ti.annView.prefix() + viewName;
        }
        if (!ti.annView.suffix().isEmpty()) {
            viewName = viewName + ti.annView.suffix();
        }
    }
    en.setTableName(tableName);
    en.setViewName(viewName);
    boolean hasTableComment = null != ti.tableComment;
    String tableComment = hasTableComment ? Strings.isBlank(ti.tableComment.value()) ? type.getName() : ti.tableComment.value() : null;
    en.setHasTableComment(hasTableComment);
    en.setTableComment(tableComment);
    /*
         * 获取所有的数据库字段
         */
    // 字段里面是不是有声明过 '@Column' @Comment
    boolean shouldUseColumn = false;
    boolean hasColumnComment = false;
    for (Field field : en.getMirror().getFields()) {
        if (shouldUseColumn && hasColumnComment) {
            break;
        }
        if (!shouldUseColumn && null != field.getAnnotation(Column.class)) {
            shouldUseColumn = true;
        }
        if (!hasColumnComment && null != field.getAnnotation(Comment.class)) {
            hasColumnComment = true;
        }
    }
    en.setHasColumnComment(hasColumnComment);
    /*
         * 循环获取实体字段
         */
    List<MappingInfo> infos = new ArrayList<MappingInfo>();
    List<LinkInfo> ones = new ArrayList<LinkInfo>();
    List<LinkInfo> manys = new ArrayList<LinkInfo>();
    List<LinkInfo> manymanys = new ArrayList<LinkInfo>();
    String[] _tmp = ti.annPK == null ? null : ti.annPK.value();
    List<String> pks = _tmp == null ? new ArrayList<String>() : Arrays.asList(_tmp);
    // 循环所有的字段,查找有没有数据库映射字段
    for (Field field : en.getMirror().getFields()) {
        // '@One'
        if (null != field.getAnnotation(One.class)) {
            ones.add(_Infos.createLinkInfo(field));
        } else // '@Many'
        if (null != field.getAnnotation(Many.class)) {
            manys.add(_Infos.createLinkInfo(field));
        } else // '@ManyMany'
        if (null != field.getAnnotation(ManyMany.class)) {
            manymanys.add(_Infos.createLinkInfo(field));
        } else // 应该忽略
        if ((Modifier.isTransient(field.getModifiers()) && null == field.getAnnotation(Column.class)) || (shouldUseColumn && (null == field.getAnnotation(Column.class) && null == field.getAnnotation(Id.class) && null == field.getAnnotation(Name.class))) && !pks.contains(field.getName())) {
            continue;
        } else // '@Column'
        {
            infos.add(_Infos.createMappingInfo(ti.annPK, field));
        }
    }
    // 循环所有方法,查找有没有虚拟数据库映射字段
    for (Method method : en.getType().getMethods()) {
        // '@One'
        if (null != method.getAnnotation(One.class)) {
            ones.add(_Infos.createLinkInfo(method));
        } else // '@Many'
        if (null != method.getAnnotation(Many.class)) {
            manys.add(_Infos.createLinkInfo(method));
        } else // '@ManyMany'
        if (null != method.getAnnotation(ManyMany.class)) {
            manymanys.add(_Infos.createLinkInfo(method));
        } else // 应该忽略
        if (null == method.getAnnotation(Column.class) && null == method.getAnnotation(Id.class) && null == method.getAnnotation(Name.class)) {
            continue;
        } else // '@Column'
        {
            infos.add(_Infos.createMapingInfo(ti.annPK, method));
        }
    }
    // 给字段排序一下, fix issue #29
    List<MappingInfo> tmp = new ArrayList<MappingInfo>(infos.size());
    MappingInfo miId = null;
    MappingInfo miName = null;
    // wjw(2017-04-10),add,version
    MappingInfo miVersion = null;
    for (MappingInfo mi : infos) {
        if (mi.annId != null) {
            if (miId != null) {
                throw new DaoException("Allows only a single @Id ! " + type);
            }
            miId = mi;
        } else if (mi.annName != null) {
            if (miName != null) {
                throw new DaoException("Allows only a single @Name ! " + type);
            }
            miName = mi;
        } else {
            // wjw(2017-04-10),add,version
            if (mi.annColumn != null && mi.annColumn.version()) {
                if (miVersion != null) {
                    throw new DaoException("Allows only a single @Version ! " + type);
                }
                miVersion = mi;
            }
            tmp.add(mi);
        }
    }
    if (miName != null)
        tmp.add(0, miName);
    if (miId != null)
        tmp.add(0, miId);
    infos = tmp;
    // 映射字段搞完了? 我看看你到底有没有字段!!
    if (infos.isEmpty())
        throw Lang.makeThrow(IllegalArgumentException.class, "Pojo(%s) without any Mapping Field!!", type);
    /*
         * 解析所有映射字段
         */
    for (MappingInfo info : infos) {
        NutMappingField ef = new NutMappingField(en);
        _evalMappingField(ef, info);
        en.addMappingField(ef);
    }
    // 保存一下,这样别的实体映射到这里时会用的到
    holder.set(en);
    try {
        // 一对一 '@One'
        for (LinkInfo li : ones) {
            en.addLinkField(new OneLinkField(en, holder, li));
        }
        // 一对多 '@Many'
        for (LinkInfo li : manys) {
            en.addLinkField(new ManyLinkField(en, holder, li));
        }
        // 多对多 '@ManyMany'
        for (LinkInfo li : manymanys) {
            en.addLinkField(new ManyManyLinkField(en, holder, li));
        }
        // 检查复合主键
        en.checkCompositeFields(null == ti.annPK ? null : ti.annPK.value());
        /*
			 * 交付给 expert 来检查一下数据库一致性
			 */
        if (null != datasource && null != expert) {
            _checkupEntityFieldsWithDatabase(en);
        }
        /*
			 * 检查字段宏
			 */
        _evalFieldMacro(en, infos);
        /*
			 * 解析实体索引
			 */
        if (null != ti.annIndexes)
            _evalEntityIndexes(en, ti.annIndexes);
    } catch (RuntimeException e) {
        holder.remove(en);
        throw e;
    } catch (Throwable e) {
        holder.remove(en);
        throw Lang.wrapThrow(e);
    }
    // 处理Pojo拦截器
    if (NutConf.DAO_USE_POJO_INTERCEPTOR && ti.annTable != null) {
        PojoInterceptor pint = Mirror.me(ti.annTable.interceptor()).born();
        pint.setupEntity(en, expert);
        en.setInterceptor(pint);
    }
    // 搞定收工,哦耶 ^_^
    en.setComplete(true);
    return en;
}
Also used : One(org.nutz.dao.entity.annotation.One) ManyMany(org.nutz.dao.entity.annotation.ManyMany) ArrayList(java.util.ArrayList) DaoException(org.nutz.dao.DaoException) ManyManyLinkField(org.nutz.dao.impl.entity.field.ManyManyLinkField) ManyLinkField(org.nutz.dao.impl.entity.field.ManyLinkField) Name(org.nutz.dao.entity.annotation.Name) NutMappingField(org.nutz.dao.impl.entity.field.NutMappingField) OneLinkField(org.nutz.dao.impl.entity.field.OneLinkField) NutMappingField(org.nutz.dao.impl.entity.field.NutMappingField) MappingField(org.nutz.dao.entity.MappingField) ManyManyLinkField(org.nutz.dao.impl.entity.field.ManyManyLinkField) ManyLinkField(org.nutz.dao.impl.entity.field.ManyLinkField) EntityField(org.nutz.dao.entity.EntityField) Field(java.lang.reflect.Field) Column(org.nutz.dao.entity.annotation.Column) TableInfo(org.nutz.dao.impl.entity.info.TableInfo) ManyManyLinkField(org.nutz.dao.impl.entity.field.ManyManyLinkField) LinkInfo(org.nutz.dao.impl.entity.info.LinkInfo) Method(java.lang.reflect.Method) OneLinkField(org.nutz.dao.impl.entity.field.OneLinkField) PojoInterceptor(org.nutz.dao.interceptor.PojoInterceptor) Id(org.nutz.dao.entity.annotation.Id) MappingInfo(org.nutz.dao.impl.entity.info.MappingInfo)

Aggregations

Field (java.lang.reflect.Field)1 Method (java.lang.reflect.Method)1 ArrayList (java.util.ArrayList)1 DaoException (org.nutz.dao.DaoException)1 EntityField (org.nutz.dao.entity.EntityField)1 MappingField (org.nutz.dao.entity.MappingField)1 Column (org.nutz.dao.entity.annotation.Column)1 Id (org.nutz.dao.entity.annotation.Id)1 ManyMany (org.nutz.dao.entity.annotation.ManyMany)1 Name (org.nutz.dao.entity.annotation.Name)1 One (org.nutz.dao.entity.annotation.One)1 ManyLinkField (org.nutz.dao.impl.entity.field.ManyLinkField)1 ManyManyLinkField (org.nutz.dao.impl.entity.field.ManyManyLinkField)1 NutMappingField (org.nutz.dao.impl.entity.field.NutMappingField)1 OneLinkField (org.nutz.dao.impl.entity.field.OneLinkField)1 LinkInfo (org.nutz.dao.impl.entity.info.LinkInfo)1 MappingInfo (org.nutz.dao.impl.entity.info.MappingInfo)1 TableInfo (org.nutz.dao.impl.entity.info.TableInfo)1 PojoInterceptor (org.nutz.dao.interceptor.PojoInterceptor)1