经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring » 查看文章
Spring?boot?Jpa添加对象字段使用数据库默认值操作
来源:jb51  时间:2021/11/23 12:52:49  对本文有异议

jpa做持久层框架,项目中数据库字段有默认值和非空约束,这样在保存对象是必须保存一个完整的对象,但在开发中我们往往只是先保存部分特殊的字段其余字段用数据库默认值,要是直接用idea生成实体类操作的话会报SQLIntegrityConstraintViolationException异常,我们需要jpa根据传入的对象存在的属性动态生成更新和添加语句需要给实体类添加@DynamicUpdate,@DynamicInsert根据对象属性生成动态update和insert语句。

建库建表

  1. CREATE TABLE `student` (
  2. `id` bigint(20) NOT NULL AUTO_INCREMENT,
  3. `name` varchar(255) NOT NULL COMMENT '姓名',
  4. `age` int(3) NOT NULL DEFAULT '0' COMMENT '年龄',
  5. `adder` varchar(255) NOT NULL DEFAULT '北京' COMMENT '地址',
  6. `class` int(15) NOT NULL DEFAULT '0' COMMENT '班级',
  7. `is_ali` tinyint(1) NOT NULL DEFAULT '0' COMMENT '阿里认证',
  8. `is_tx` tinyint(1) NOT NULL DEFAULT '0' COMMENT '腾讯认证',
  9. PRIMARY KEY (`id`)
  10. ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

项目搭建

代码

配置文件

  1. spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true
  2. spring.datasource.username=root
  3. spring.datasource.password=root
  4. spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  5. spring.jpa.database=mysql
  6. spring.jpa.hibernate.ddl-auto=update
  7. spring.jpa.show-sql=true

StudnetController

  1. package com.myjpa.demo.controller;
  2. import com.myjpa.demo.service.StudentService;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.web.bind.annotation.PutMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. @RestController
  7. public class StudnetController {
  8. @Autowired
  9. StudentService student;
  10. @PutMapping("/add")
  11. public String insertStudent(String name, Integer age) {
  12. student.addStudent(name, age);
  13. return "添加成功";
  14. }
  15. }

StudentService

  1. package com.myjpa.demo.service;
  2. import com.myjpa.demo.entity.StudentEntity;
  3. import com.myjpa.demo.respository.StudentRespository;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Service;
  6. import org.springframework.transaction.annotation.Transactional;
  7. @Service
  8. @Transactional(rollbackFor = Exception.class)
  9. public class StudentService {
  10. @Autowired
  11. StudentRespository studentRespository;
  12. public void addStudent(String name, Integer age) {
  13. StudentEntity s = new StudentEntity();
  14. s.setName(name);
  15. s.setAge(age);
  16. studentRespository.save(s);
  17. }
  18. }

StudentRespository

  1. package com.myjpa.demo.respository;
  2. import com.myjpa.demo.entity.StudentEntity;
  3. import org.springframework.data.jpa.repository.JpaRepository;
  4. import org.springframework.stereotype.Repository;
  5. @Repository
  6. public interface StudentRespository extends JpaRepository<StudentEntity, Long> {
  7. }

StudentEntity 实体类可以使用idea反向生成

  1. package com.myjpa.demo.entity;
  2. import org.hibernate.annotations.DynamicInsert;
  3. import org.hibernate.annotations.DynamicUpdate;
  4. import javax.persistence.*;
  5. import java.util.Objects;
  6. @Entity
  7. @Table(name = "student", schema = "test")
  8. public class StudentEntity {
  9. private long id;
  10. private String name;
  11. private int age;
  12. private String adder;
  13. private int clazz;
  14. private byte isAli;
  15. private byte isTx;
  16. @Id
  17. @Column(name = "id")
  18. public long getId() {
  19. return id;
  20. }
  21. public void setId(long id) {
  22. this.id = id;
  23. }
  24. @Basic
  25. @Column(name = "name")
  26. public String getName() {
  27. return name;
  28. }
  29. public void setName(String name) {
  30. this.name = name;
  31. }
  32. @Basic
  33. @Column(name = "age")
  34. public int getAge() {
  35. return age;
  36. }
  37. public void setAge(int age) {
  38. this.age = age;
  39. }
  40. @Basic
  41. @Column(name = "adder")
  42. public String getAdder() {
  43. return adder;
  44. }
  45. public void setAdder(String adder) {
  46. this.adder = adder;
  47. }
  48. @Basic
  49. @Column(name = "class")
  50. public int getClazz() {
  51. return clazz;
  52. }
  53. public void setClazz(int clazz) {
  54. this.clazz = clazz;
  55. }
  56. @Basic
  57. @Column(name = "is_ali")
  58. public byte getIsAli() {
  59. return isAli;
  60. }
  61. public void setIsAli(byte isAli) {
  62. this.isAli = isAli;
  63. }
  64. @Basic
  65. @Column(name = "is_tx")
  66. public byte getIsTx() {
  67. return isTx;
  68. }
  69. public void setIsTx(byte isTx) {
  70. this.isTx = isTx;
  71. }
  72. @Override
  73. public boolean equals(Object o) {
  74. if (this == o) return true;
  75. if (o == null || getClass() != o.getClass()) return false;
  76. StudentEntity that = (StudentEntity) o;
  77. return id == that.id &&
  78. age == that.age &&
  79. clazz == that.clazz &&
  80. isAli == that.isAli &&
  81. isTx == that.isTx &&
  82. Objects.equals(name, that.name) &&
  83. Objects.equals(adder, that.adder);
  84. }
  85. @Override
  86. public int hashCode() {
  87. return Objects.hash(id, name, age, adder, clazz, isAli, isTx);
  88. }
  89. }

DemoApplication

  1. package com.myjpa.demo;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class DemoApplication {
  6. public static void main(String[] args) {
  7. SpringApplication.run(DemoApplication.class, args);
  8. }
  9. }

错误测试

问题主要在于实体类,因为jpa生成sql依靠实体类

发送请求

服务器错误

解决问题

修改StudentEntity添加两个注解

  • @DynamicUpdate
  • @DynamicInsert

服务器更新,再次发送请求

数据库结果

成功~

以上为个人经验,希望能给大家一个参考,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号