Spring|Spring boot Jpa添加对象字段使用数据库默认值操作

目录

  • 项目搭建Spring|Spring boot Jpa添加对象字段使用数据库默认值操作
    文章图片

    代码
    配置文件
    spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=truespring.datasource.username=rootspring.datasource.password=rootspring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.jpa.database=mysqlspring.jpa.hibernate.ddl-auto=updatespring.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; @RestControllerpublic class StudnetController {@AutowiredStudentService 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 {@AutowiredStudentRespository 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; @Repositorypublic interface StudentRespository extends JpaRepository {}

    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; }@Overridepublic 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); }@Overridepublic 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; @SpringBootApplicationpublic class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args); }}

    错误测试问题主要在于实体类,因为jpa生成sql依靠实体类
    发送请求
    Spring|Spring boot Jpa添加对象字段使用数据库默认值操作
    文章图片

    服务器错误
    Spring|Spring boot Jpa添加对象字段使用数据库默认值操作
    文章图片

    解决问题
Spring boot Jpa添加对象字段使用数据库默认值
jpa做持久层框架,项目中数据库字段有默认值和非空约束,这样在保存对象是必须保存一个完整的对象,但在开发中我们往往只是先保存部分特殊的字段其余字段用数据库默认值,要是直接用idea生成实体类操作的话会报SQLIntegrityConstraintViolationException异常,我们需要jpa根据传入的对象存在的属性动态生成更新和添加语句需要给实体类添加@DynamicUpdate,@DynamicInsert根据对象属性生成动态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|Spring boot Jpa添加对象字段使用数据库默认值操作
文章图片

代码
配置文件
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=truespring.datasource.username=rootspring.datasource.password=rootspring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.jpa.database=mysqlspring.jpa.hibernate.ddl-auto=updatespring.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; @RestControllerpublic class StudnetController {@AutowiredStudentService 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 {@AutowiredStudentRespository 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; @Repositorypublic interface StudentRespository extends JpaRepository {}

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; }@Overridepublic 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); }@Overridepublic 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; @SpringBootApplicationpublic class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args); }}

错误测试 问题主要在于实体类,因为jpa生成sql依靠实体类
发送请求
Spring|Spring boot Jpa添加对象字段使用数据库默认值操作
文章图片

服务器错误
Spring|Spring boot Jpa添加对象字段使用数据库默认值操作
文章图片

解决问题 修改StudentEntity添加两个注解
  • @DynamicUpdate
  • @DynamicInsert
Spring|Spring boot Jpa添加对象字段使用数据库默认值操作
文章图片

服务器更新,再次发送请求
Spring|Spring boot Jpa添加对象字段使用数据库默认值操作
文章图片

Spring|Spring boot Jpa添加对象字段使用数据库默认值操作
文章图片

数据库结果
Spring|Spring boot Jpa添加对象字段使用数据库默认值操作
文章图片

成功
【Spring|Spring boot Jpa添加对象字段使用数据库默认值操作】以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

    推荐阅读