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依靠实体类
发送请求
文章图片
服务器错误
文章图片
解决问题
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.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依靠实体类
发送请求
文章图片
服务器错误
文章图片
解决问题 修改StudentEntity添加两个注解
@DynamicUpdate
@DynamicInsert
文章图片
服务器更新,再次发送请求
文章图片
文章图片
数据库结果
文章图片
成功
【Spring|Spring boot Jpa添加对象字段使用数据库默认值操作】以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- Activiti(一)SpringBoot2集成Activiti6
- SpringBoot调用公共模块的自定义注解失效的解决
- 解决SpringBoot引用别的模块无法注入的问题
- 2018-07-09|2018-07-09 Spring 的DBCP,c3p0
- spring|spring boot项目启动websocket
- Spring|Spring Boot 整合 Activiti6.0.0
- Spring集成|Spring集成 Mina
- springboot使用redis缓存
- Spring|Spring 框架之 AOP 原理剖析已经出炉!!!预定的童鞋可以识别下发二维码去看了
- Spring|Spring Boot之ImportSelector