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.impl.EntityHolder;
import org.nutz.dao.impl.entity.info.LinkInfo;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;
public class OneLinkField extends AbstractLinkField {
public OneLinkField(Entity<?> entity, EntityHolder holder, LinkInfo info) {
super(entity, holder, info);
this.targetType = info.one.target();
// 宿主实体的字段
hostField = entity.getField(info.one.field());
if (null == hostField)
throw Lang.makeThrow( "Invalid @One(field=%s) '%s' : %s<=>%s",
info.one.field(),
this.getName(),
this.getEntity().getType(),
this.getLinkedEntity().getType());
if (!Strings.isBlank(info.one.key())) {
linkedField = this.getLinkedEntity().getField(info.one.key());
if (linkedField == null)
throw Lang.makeThrow( "Fail to find linkedField for @One(field=%s) '%s' : %s<=>%s By key=%s",
info.one.field(),
this.getName(),
this.getEntity().getType(),
this.getLinkedEntity().getType(),
info.one.key());
return;
}
// 链接实体的字段
linkedField = hostField.getTypeMirror().isIntLike() ? this.getLinkedEntity().getIdField()
: this.getLinkedEntity().getNameField();
if (null == linkedField)
throw Lang.makeThrow( "Fail to find linkedField for @One(field=%s) '%s' : %s<=>%s By %s",
info.one.field(),
this.getName(),
this.getEntity().getType(),
this.getLinkedEntity().getType(),
hostField.getTypeMirror().isIntLike() ? "@Id" : "@Name");
}
public Condition createCondition(Object host) {
return Cnd.where(linkedField.getColumnName(), "=", hostField.getValue(host));
}
public void updateLinkedField(Object obj, Object linked) {}
public void saveLinkedField(Object obj, Object linked) {
Object v = linkedField.getValue(linked);
hostField.setValue(obj, v);
}
public LinkType getLinkType() {
return LinkType.ONE;
}
}