比如一个班级有很多学生。
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()
方法
public boolean equals(Object obj) {
if (obj instanceof Student) {
Student s = (Student) obj;
return s.getId() == this.id;
}
return super.equals(obj);
}
然后发现还是不妥,万一学生改名了呢...
还是直接用JPA吧,于是看了一下save()
是怎么做的
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来看,效率还是挺高的。