Spring Data JPA save()

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

相關文章
相關標籤/搜索