Spring?boot?Jpa添加對象字段使用數(shù)據(jù)庫默認值操作
jpa做持久層框架,項目中數(shù)據(jù)庫字段有默認值和非空約束,這樣在保存對象是必須保存一個完整的對象,但在開發(fā)中我們往往只是先保存部分特殊的字段其余字段用數(shù)據(jù)庫默認值,要是直接用idea生成實體類操作的話會報SQLIntegrityConstraintViolationException異常,我們需要jpa根據(jù)傳入的對象存在的屬性動態(tài)生成更新和添加語句需要給實體類添加@DynamicUpdate,@DynamicInsert根據(jù)對象屬性生成動態(tài)update和insert語句。
建庫建表
CREATE TABLE `student` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL COMMENT '姓名', `age` int(3) NOT NULL DEFAULT '0' COMMENT '年齡', `adder` varchar(255) NOT NULL DEFAULT '北京' COMMENT '地址', `class` int(15) NOT NULL DEFAULT '0' COMMENT '班級', `is_ali` tinyint(1) NOT NULL DEFAULT '0' COMMENT '阿里認證', `is_tx` tinyint(1) NOT NULL DEFAULT '0' COMMENT '騰訊認證', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
項目搭建

代碼
配置文件
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.jpa.database=mysql spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true
StudnetController
package com.myjpa.demo.controller;
import com.myjpa.demo.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class StudnetController {
@Autowired
StudentService student;
@PutMapping("/add")
public String insertStudent(String name, Integer age) {
student.addStudent(name, age);
return "添加成功";
}
}
StudentService
package com.myjpa.demo.service;
import com.myjpa.demo.entity.StudentEntity;
import com.myjpa.demo.respository.StudentRespository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional(rollbackFor = Exception.class)
public class StudentService {
@Autowired
StudentRespository studentRespository;
public void addStudent(String name, Integer age) {
StudentEntity s = new StudentEntity();
s.setName(name);
s.setAge(age);
studentRespository.save(s);
}
}
StudentRespository
package com.myjpa.demo.respository;
import com.myjpa.demo.entity.StudentEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface StudentRespository extends JpaRepository<StudentEntity, Long> {
}
StudentEntity 實體類可以使用idea反向生成
package com.myjpa.demo.entity;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.*;
import java.util.Objects;
@Entity
@Table(name = "student", schema = "test")
public class StudentEntity {
private long id;
private String name;
private int age;
private String adder;
private int clazz;
private byte isAli;
private byte isTx;
@Id
@Column(name = "id")
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@Basic
@Column(name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Basic
@Column(name = "age")
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Basic
@Column(name = "adder")
public String getAdder() {
return adder;
}
public void setAdder(String adder) {
this.adder = adder;
}
@Basic
@Column(name = "class")
public int getClazz() {
return clazz;
}
public void setClazz(int clazz) {
this.clazz = clazz;
}
@Basic
@Column(name = "is_ali")
public byte getIsAli() {
return isAli;
}
public void setIsAli(byte isAli) {
this.isAli = isAli;
}
@Basic
@Column(name = "is_tx")
public byte getIsTx() {
return isTx;
}
public void setIsTx(byte isTx) {
this.isTx = isTx;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
StudentEntity that = (StudentEntity) o;
return id == that.id &&
age == that.age &&
clazz == that.clazz &&
isAli == that.isAli &&
isTx == that.isTx &&
Objects.equals(name, that.name) &&
Objects.equals(adder, that.adder);
}
@Override
public int hashCode() {
return Objects.hash(id, name, age, adder, clazz, isAli, isTx);
}
}
DemoApplication
package com.myjpa.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
錯誤測試
問題主要在于實體類,因為jpa生成sql依靠實體類
發(fā)送請求

服務器錯誤

解決問題
修改StudentEntity添加兩個注解
@DynamicUpdate@DynamicInsert

服務器更新,再次發(fā)送請求


數(shù)據(jù)庫結果

成功~
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
springboot實現(xiàn)excel表格導出幾種常見方法
在日常的開發(fā)中避免不了操作Excel,下面這篇文章主要給大家介紹了關于springboot實現(xiàn)excel表格導出的幾種常見方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2023-11-11
mac下修改idea的jvm運行參數(shù)解決idea卡頓的情況
這篇文章主要介紹了mac下修改idea的jvm運行參數(shù)解決idea卡頓的情況,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
SpringBoot對接AWS?S3實現(xiàn)上傳和查詢
AWS?S3是亞馬遜提供的一種對象存儲服務,旨在提供可擴展、高可用性和安全的數(shù)據(jù)存儲解決方案,本文我們就來看看SpringBoot如何對接AWS?S3實現(xiàn)上傳和查詢吧2025-02-02
SpringMVC跨服務器上傳文件中出現(xiàn)405錯誤的解決
這篇文章主要介紹了SpringMVC跨服務器上傳文件中出現(xiàn)405錯誤的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
Spring Security自定義異常 AccessDeniedHandler不生效解決方法
本文主要介紹了Spring Security自定義異常 AccessDeniedHandler不生效解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-07-07
在SpringBoot項目中實現(xiàn)給所有請求加固定前綴
這篇文章主要介紹了在SpringBoot項目中實現(xiàn)給所有請求加固定前綴,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
解決weblogic部署springboot項目步驟及可能會出現(xiàn)的問題
這篇文章主要介紹了解決weblogic部署springboot項目步驟及可能會出現(xiàn)的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
java實現(xiàn)圖像轉(zhuǎn)碼為字符畫的方法
這篇文章主要為大家詳細介紹了java實現(xiàn)圖像轉(zhuǎn)碼為字符畫的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03

