[英]How to update an entity in jpa?
我正在按照以下方式進行操作。 這讓我感到惡心!
public class CounselInfoServiceImpl
extends BaseServiceImpl<CounselInfoDao, CounselInfoEntity, Long>
implements CounselInfoService {
@Inject
ClassService classService;
@Inject
@Override
public void setDao(CounselInfoDao dao)
{
super.setDao(dao);
}
@Override
public CounselInfoEntity editTo(CounselInfoEntity model)
{
CounselInfoEntity entity = id(model.getId());
if (!Strings.isNullOrEmpty(model.getName()))
{
entity.setName(model.getName());
}
if (!Strings.isNullOrEmpty(model.getAddress()))
{
entity.setAddress(model.getAddress());
}
if (!Strings.isNullOrEmpty(model.getEducation()))
{
entity.setEducation(model.getEducation());
}
if (!Strings.isNullOrEmpty(model.getPhone()))
{
entity.setPhone(model.getPhone());
}
if (!Strings.isNullOrEmpty(model.getQQ()))
{
entity.setQQ(model.getQQ());
}
if (!Strings.isNullOrEmpty(model.getRemark()))
{
entity.setPhone(model.getPhone());
}
if (!Strings.isNullOrEmpty(model.getSchool()))
{
entity.setSchool(model.getSchool());
}
if (model.getAge() != null)
{
entity.setAge(model.getAge());
}
if (model.getSex() != null)
{
entity.setSex(model.getSex());
}
if (model.getClassIntention() != null)
{
entity.setClassIntention(
classService.id(
model.getClassIntention().getId()));
}
return entity;
}
}
有什么建議可以避免此spaghetti code
嗎?
順便說一句,編寫此代碼是一項艱苦的工作!
編輯
順便說一句,我不認為em.merge
已經為此做好了准備。 看這里
The EntityManager.merge() operation is used to merge the changes made to a detached object into the persistence context.
它提到了detached object
,但是更新模型只是花費了一些時間。 因此,如果我合並模型,則模型的所有值都將應用於實體。(例如,密碼,我不想更新, editTo
不應觸摸密碼。)
現在,更新看起來像這樣。
public CounselInfoEntity editTo(CounselInfoEntity model)
{
CounselInfoEntity entity = id(model.getId());
List<? extends Attribute<CounselInfoEntity, ?>> editAttrs = Lists.<Attribute<CounselInfoEntity, ?>>newArrayList(CounselInfoEntity_.name,
CounselInfoEntity_.address,
CounselInfoEntity_.education,
CounselInfoEntity_.phone,
CounselInfoEntity_.QQ,
CounselInfoEntity_.remark,
CounselInfoEntity_.school,
CounselInfoEntity_.age,
CounselInfoEntity_.sex);
BeanHelper.merge(entity, model, BeanHelper.skipNullOrEmpty(model, editAttrs));
if (model.getClassIntention() != null)
{
entity.setClassIntention(classService.id(model.getClassIntention().getId()));
}
return entity;
}
這是BeanHelper
package me.wener.practices.web.common.util;
import com.google.common.collect.Lists;
import java.lang.reflect.Field;
import java.util.List;
import javax.persistence.metamodel.Attribute;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.reflect.FieldUtils;
@Slf4j
public class BeanHelper
{
/**
* 獲取 bean 的屬性,如果屬性不存在或發生異常返回null
*/
public static Object tryGetProperty(Object bean, String attrName)
{
Object property = null;
try
{
Field field = FieldUtils.getField(bean.getClass(), attrName, true);
property = field.get(bean);
} catch (Exception e)
{
if (log.isErrorEnabled())
log.error("Exception when get property " + attrName + " on " + bean, e);
}
return property;
}
public static <T, A extends Attribute<T, ?>> Object tryGetProperty(T bean, A attr)
{
return tryGetProperty(bean, attr.getName());
}
public static <T, A extends Attribute<T, ?>> boolean trySetProperty(T bean, A attr, Object value)
{
return trySetProperty(bean, attr.getName(), value);
}
public static boolean trySetProperty(Object bean, String attrName, Object value)
{
boolean failed = false;
try
{
// 對於 chain 的 setter 方法, 必須要使用 force access.
Field field = FieldUtils.getField(bean.getClass(), attrName, true);
field.set(bean, value);
} catch (Exception e)
{
if (log.isErrorEnabled())
log.error("Exception when set property " + attrName + " on " + bean, e);
failed = true;
}
return !failed;
}
/**
* Test the value of search in attrs is make the isNull and isEmpty
* <p/>
* isEmpty will apply when value is String
*/
@SafeVarargs
public static <E, A extends Attribute<E, ?>> List<A> skip(Object searcher, boolean skipNull, boolean skipEmpty, A... attrs)
{
return skip(searcher, skipNull, skipEmpty, Lists.newArrayList(attrs));
}
public static <E, A extends Attribute<E, ?>> List<A> skip(Object searcher, boolean skipNull, boolean skipEmpty, List<A> attrs)
{
List<A> list = Lists.newArrayList();
boolean valid;
for (A attr : attrs)
{
Object value = tryGetProperty(searcher, attr.getName());
valid = skipNull || value != null;
if (valid && skipEmpty && value instanceof String)
valid = ((String) value).length() != 0;
if (valid)
list.add(attr);
}
return list;
}
@SafeVarargs
public static <E, A extends Attribute<E, ?>> List<A> skipNullOrEmpty(Object searcher, A... attrs)
{
return skip(searcher, true, true, attrs);
}
public static <E, A extends Attribute<E, ?>> List<A> skipNullOrEmpty(Object searcher, List<A> attrs)
{
return skip(searcher, true, true, attrs);
}
@SafeVarargs
public static <T, A extends Attribute<T, ?>> T merge(T target, T src, A... attrs)
{
return merge(target, src, Lists.newArrayList(attrs));
}
public static <T, A extends Attribute<T, ?>> T merge(T target, T src, List<A> attrs)
{
for (A attr : attrs)
{
String attrName = attr.getName();
Object value = tryGetProperty(src, attrName);
trySetProperty(target, attrName, value);
}
return target;
}
}
這個更好,因為
它包括
我盡力而為,這是我所能做到的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.