一说是实体类添加注解:
@Entity
@DynamicInsert(true) // true 是默认值,写不写一样
@DynamicUpdate(true) // true 是默认值,写不写一样
实测,并没有效果。
最终实现方法,通过反射自己来写一个方法:
student类的代码:
@Entity
@DynamicInsert(true) // true 是默认值,写不写一样
@DynamicUpdate(true) // true 是默认值,写不写一样
public class Student {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@Column
private String name;
@Column
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
jpa接口的代码:
public interface StudentRepository extends JpaRepository<Student, Integer>{
}
测试类,以及反射方法的代码:
@SpringBootTest
public class StudentDaoTest {
@Autowired
private StudentRepository StudentRepository;
@Test
public void save() {
Student student = new Student();
student.setName("lisi");
Optional<Student> optional = StudentRepository.findById(1);
Student origin = optional.get();
updateEntity(student,origin);
StudentRepository.save(origin);
}
public <T> T updateEntity(T entity,T oldEntity){
Class clazz = entity.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields){ // 遍历属性
try {
PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
Method readMethod = pd.getReadMethod(); //获取属性的get方法
Method writeMethod= pd.getWriteMethod(); //获取属性的set方法
if (readMethod.invoke(entity)!=null){ // 如果这个属性不为null
// old对象set(entity.get()) old对象将属性值设置为entity的属性值
writeMethod.invoke(oldEntity,readMethod.invoke(entity));
}
}catch (Exception e){
}
}
return oldEntity;
}
}
数据库初始为:
执行完测试类之后, age不为null,zhangsan更新为lisi,表示成功。
如图: