package org.nutz.dao.impl.entity.field;
import org.nutz.dao.Cnd;
import org.nutz.dao.Condition;
import org.nutz.dao.entity.Entity;
import org.nutz.dao.entity.LinkType;
import org.nutz.dao.entity.MappingField;
import org.nutz.dao.impl.EntityHolder;
import org.nutz.dao.impl.entity.info.LinkInfo;
import org.nutz.lang.Each;
import org.nutz.lang.ExitLoop;
import org.nutz.lang.Lang;
import org.nutz.lang.LoopException;
import org.nutz.lang.Strings;
public class ManyLinkField extends AbstractLinkField {
public ManyLinkField(Entity<?> entity, EntityHolder holder, LinkInfo info) {
super(entity, holder, info);
this.targetType = info.many.target();
this.mapKey = info.many.key();
Entity<?> ta = this.getLinkedEntity();
// 链接对方全部内容
if (Strings.isBlank(info.many.field())) {
hostField = null;
linkedField = null;
}
// 根据一个字段的值链接
else {
linkedField = ta.getField(info.many.field());
if (null == linkedField)
throw Lang.makeThrow( "Invalid @Many(field=%s) '%s' : %s<=>%s",
info.many.field(),
this.getName(),
this.getEntity().getType(),
ta.getType());
// 宿主实体的字段 - 应该是主键
if (Strings.isBlank(mapKey)) {
hostField = linkedField.getTypeMirror().isIntLike() ? this.getEntity().getIdField()
: this.getEntity().getNameField();
} else {
hostField = this.getEntity().getField(mapKey);
}
if (null == hostField)
throw Lang.makeThrow( "Fail to find hostField for @Many(field=%s) '%s' : %s<=>%s",
info.many.field(),
this.getName(),
this.getEntity().getType(),
ta.getType());
}
}
public Condition createCondition(Object host) {
return null == linkedField ? null : Cnd.where( linkedField.getName(),
"=",
hostField.getValue(host));
}
public void updateLinkedField(Object obj, Object linked) {
if (null != hostField) {
final Object v = hostField.getValue(obj);
Lang.each(linked, new Each<Object>() {
public void invoke(int i, Object ele, int length) throws ExitLoop, LoopException {
linkedField.setValue(ele, v);
}
});
}
}
public MappingField getHostField() {
return hostField;
}
public MappingField getLinkedField() {
return linkedField;
}
public void saveLinkedField(Object obj, Object linked) {}
public LinkType getLinkType() {
return LinkType.MANY;
}
}