Spring Data JPA save()

比如一个班级有很多学生。

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来看,效率还是挺高的。

转载于:https://my.oschina.net/u/3035165/blog/1586996

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值