好比一个班级有不少学生。sql
class Group { int id; List<Student> students; } class Student { int id; String name; }
我拿到了一个新的new_group
,而数据库中有一个old_group
。 如今要把它扔到数据库中去,对于students
,由于不想所有删除而后再插入(之前都是这么干的),因此一开始,我想出了一个办法。数据库
for old_students if (old_students.contains(new_student)) continue else old_students.add(new_student)
也所以重写了equals()
方法this
public boolean equals(Object obj) { if (obj instanceof Student) { Student s = (Student) obj; return s.getId() == this.id; } return super.equals(obj); }
而后发现仍是不妥,万一学生更名了呢...code
仍是直接用JPA吧,因而看了一下save()
是怎么作的orm
class SimpleJpaRepository @Transactional public <S extends T> S save(S entity) { if (entityInformation.isNew(entity)) { em.persist(entity); return entity; } else { return em.merge(entity); } }
class AbstractEntityInformation public boolean isNew(T entity) { ID id = getId(entity); Class<ID> idType = getIdType(); if (!idType.isPrimitive()) { return id == null; } if (id instanceof Number) { return ((Number) id).longValue() == 0L; } throw new IllegalArgumentException(String.format("Unsupported primitive id type %s!", idType)); }
结果也是id,好吧,最后仍是merge
吧,实际上我只要组装好最终的students
,剩下的东西就不用管了,若是使用了@DynamicUpdate
,从sql来看,效率仍是挺高的。get