好比一個班級有不少學生。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