Search in sources :

Example 1 with ManyManyLinkField

use of org.nutz.dao.impl.entity.field.ManyManyLinkField in project nutz by nutzam.

the class AbstractJdbcExpert method createRelation.

protected Sql createRelation(Dao dao, LinkField lf) {
    ManyManyLinkField mm = (ManyManyLinkField) lf;
    if (dao.exists(mm.getRelationName()))
        return null;
    String sql = "CREATE TABLE " + mm.getRelationName() + "(" + "\n";
    sql += mm.getFromColumnName() + " " + evalFieldType(mm.getHostField()) + "," + "\n";
    sql += mm.getToColumnName() + " " + evalFieldType(mm.getLinkedField()) + "\n";
    sql += ")";
    return Sqls.create(sql);
}
Also used : ManyManyLinkField(org.nutz.dao.impl.entity.field.ManyManyLinkField)

Example 2 with ManyManyLinkField

use of org.nutz.dao.impl.entity.field.ManyManyLinkField in project nutz by nutzam.

the class DoClearRelationByHostFieldLinkVisitor method visit.

public void visit(Object obj, LinkField lnk) {
    if (lnk instanceof ManyManyLinkField) {
        final ManyManyLinkField mm = (ManyManyLinkField) lnk;
        final Pojo pojo = opt.maker().makeDelete(mm.getRelationName());
        pojo.append(Pojos.Items.cndColumn(mm.getFromColumnName(), mm.getHostField(), mm.getHostField().getValue(obj)));
        opt.add(pojo);
    }
}
Also used : Pojo(org.nutz.dao.sql.Pojo) ManyManyLinkField(org.nutz.dao.impl.entity.field.ManyManyLinkField)

Example 3 with ManyManyLinkField

use of org.nutz.dao.impl.entity.field.ManyManyLinkField in project nutz by nutzam.

the class EntityParsingTest method eval_manymany.

@Test
public void eval_manymany() {
    Entity<?> en = en(Base.class);
    ManyManyLinkField link = (ManyManyLinkField) en.getLinkFields("fighters").get(0);
    assertEquals("dao_m_base_fighter", link.getRelationName());
}
Also used : ManyManyLinkField(org.nutz.dao.impl.entity.field.ManyManyLinkField) Test(org.junit.Test)

Example 4 with ManyManyLinkField

use of org.nutz.dao.impl.entity.field.ManyManyLinkField 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)

Example 5 with ManyManyLinkField

use of org.nutz.dao.impl.entity.field.ManyManyLinkField in project nutz by nutzam.

the class AbstractJdbcExpert method dropRelation.

public void dropRelation(Dao dao, Entity<?> en) {
    final List<Sql> sqls = new ArrayList<Sql>(5);
    for (LinkField lf : en.visitManyMany(null, null, null)) {
        ManyManyLinkField mm = (ManyManyLinkField) lf;
        if (!dao.exists(mm.getRelationName()))
            continue;
        sqls.add(Sqls.create("DROP TABLE " + mm.getRelationName()));
    }
    dao.execute(sqls.toArray(new Sql[sqls.size()]));
}
Also used : ArrayList(java.util.ArrayList) ManyManyLinkField(org.nutz.dao.impl.entity.field.ManyManyLinkField) ManyManyLinkField(org.nutz.dao.impl.entity.field.ManyManyLinkField) LinkField(org.nutz.dao.entity.LinkField) Sql(org.nutz.dao.sql.Sql)

Aggregations

ManyManyLinkField (org.nutz.dao.impl.entity.field.ManyManyLinkField)9 Pojo (org.nutz.dao.sql.Pojo)4 ArrayList (java.util.ArrayList)3 Test (org.junit.Test)2 ExitLoop (org.nutz.lang.ExitLoop)2 LoopException (org.nutz.lang.LoopException)2 Field (java.lang.reflect.Field)1 Method (java.lang.reflect.Method)1 Map (java.util.Map)1 DaoException (org.nutz.dao.DaoException)1 EntityField (org.nutz.dao.entity.EntityField)1 LinkField (org.nutz.dao.entity.LinkField)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 NutMappingField (org.nutz.dao.impl.entity.field.NutMappingField)1