package org.nutz.dao.impl.entity.field;
import org.nutz.dao.Cnd;
import org.nutz.dao.Condition;
import org.nutz.dao.DaoException;
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.Lang;
import org.nutz.lang.Strings;
public class OneLinkField extends AbstractLinkField {
public OneLinkField(Entity<?> entity,
EntityHolder holder,
LinkInfo info,
Class<?> target,
MappingField field,
MappingField key) {
super(entity, holder, info);
this.targetType = target;
this.hostField = field;
this.linkedField = key;
}
public OneLinkField(Entity<?> entity, EntityHolder holder, LinkInfo info) {
super(entity, holder, info);
this.targetType = guessTargetClass(info, info.one.target());
if (Strings.isBlank(info.one.field()))
throw new DaoException("Invalid @One(field=\"\") at class="
+ getEntity().getType().getName());
String hostFieldName = "_".equals(info.one.field()) ? info.name + "Id" : info.one.field();
// 宿主实体的字段
hostField = entity.getField(hostFieldName);
if (null == hostField)
throw new DaoException(String.format("Invalid @One(field=%s) '%s' : %s<=>%s",
hostFieldName,
getName(),
getEntity().getType(),
getLinkedEntity().getType()));
if (!Strings.isBlank(info.one.key())) {
linkedField = this.getLinkedEntity().getField(info.one.key());
if (linkedField == null)
throw new DaoException(String.format("Fail to find linkedField for @One(field=%s) '%s' : %s<=>%s By key=%s",
hostFieldName,
getName(),
getEntity().getType(),
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",
hostFieldName,
getName(),
getEntity().getType(),
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) {
if (hostField.isId()) {
Object val = linkedField.getValue(linked);
if (val != null && val instanceof Number) {
if (((Number) val).doubleValue() == 0.0) {
linkedField.setValue(linked, hostField.getValue(obj));
}
}
}
}
public void saveLinkedField(Object obj, Object linked) {
Object v = linkedField.getValue(linked);
hostField.setValue(obj, v);
}
public LinkType getLinkType() {
return LinkType.ONE;
}
}