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 '' COMMENT '年龄',
`adder` varchar(255) NOT NULL DEFAULT '北京' COMMENT '地址',
`class` int(15) NOT NULL DEFAULT '' COMMENT '班级',
`is_ali` tinyint(1) NOT NULL DEFAULT '' COMMENT '阿里认证',
`is_tx` tinyint(1) NOT NULL DEFAULT '' 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依靠实体类
发送请求

服务器错误

解决问题
修改StudentEntity添加两个注解
@DynamicUpdate
@DynamicInsert

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


数据库结果

成功
Spring boot Jpa添加对象字段使用数据库默认值的更多相关文章
- spring cloud spring boot JPA 克隆对象修改属性后 无法正常的执行save方法进行保存或者更新
2019-12-1220:34:58 spring cloud spring boot JPA 克隆对象修改属性后 无法正常的执行save方法进行保存或者更新 未解决
- spring boot ----> jpa连接和操作mysql数据库
环境: centos6.8,jdk1.8.0_172,maven3.5.4,vim,spring boot 1.5.13,mysql-5.7.23 1.引入jpa起步依赖和mysql驱动jar包 &l ...
- Java Spring Boot VS .NetCore (四)数据库操作 Spring Data JPA vs EFCore
Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...
- Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题
(转载)Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题 这几天在用spring boot开发项目, 在开发的过程中遇到一个问题hibernate在执 ...
- Spring Boot(五):Spring Boot Jpa 的使用
在上篇文章Spring Boot(二):Web 综合开发中简单介绍了一下 Spring Boot Jpa 的基础性使用,这篇文章将更加全面的介绍 Spring Boot Jpa 常见用法以及注意事项. ...
- Spring Boot Jpa 的使用
Spring Boot Jpa 介绍 首先了解 Jpa 是什么? Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范.它为 Java 开发人员提供了一种 ...
- (转)Spring Boot(五):Spring Boot Jpa 的使用
http://www.ityouknow.com/springboot/2016/08/20/spring-boot-jpa.html 在上篇文章Spring Boot(二):Web 综合开发中简单介 ...
- Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例
Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例 一.快速上手 1,配置文件 (1)pom包配置 pom包里面添加jpa和thymeleaf的相关包引用 ...
- Spring boot JPA 用自定义主键策略 生成自定义主键ID
最近学习Spring boot JPA 学习过程解决的一些问题写成随笔,大家一起成长.这次遇到自定义主键的问题 package javax.persistence; public enum Gener ...
随机推荐
- fminunc
options = optimset('GradObj', 'on', 'MaxIter', 400); % Run fminunc to obtain the optimal theta% This ...
- iOS中城市定位功能的实现
引入框架:CoreLocation .h文件 引入CoreLocation/CoreLocation.h @interface WeatherViewController :UIViewControl ...
- BigDecimal快速使用
double类型最多支持16位有效数字,且最大值只支持10^308次方,大一点的数字会变为科学计数法,小数精度不够等有一系列不方便的问题: 引进BigDecimal解决此类麻烦,弊端,BigDecim ...
- WAS:服务器停电后,重启DMGR,控制台访问不了
1. 今天有现场WAS服务器停电,重启DMGR后,控制台网页打不开: 后来得知,防火墙可能有问题.(虽然之前该机器上防火墙是关着的,但掉电后,防火墙会重启规则) 关掉防火墙后,问题解决. 2. ...
- hihocoder-1347 小h的树上的朋友(lca+线段树)
题目链接: 小h的树上的朋友 时间限制:18000ms 单点时限:2000ms 内存限制:512MB 描述 小h拥有n位朋友.每位朋友拥有一个数值Vi代表他与小h的亲密度.亲密度有可能发生变化. 岁月 ...
- BZOJ_1812_[Ioi2005]riv_树形DP
BZOJ_1812_[Ioi2005]riv_树形DP Description 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了 ...
- Git如何删除自己创建的项目
版本管理器第二行最右边,找到倒三角,下面的Edit Project,拖动鼠标到最下面,Remove project ,弹出框Confirmation required里面输入项目名字,如项目名字为“w ...
- 【转】Chrome调试鼠标悬停后出现的元素
原文地址:https://blog.csdn.net/sparrowflying/article/details/80996550 调试小技巧:调试样式的时候,有一类元素是鼠标悬停在特定位置才会出现的 ...
- Python-day-9- RabbitMQ队列
RabbitMQ队列 安装 http://www.rabbitmq.com/install-standalone-mac.html 安装python rabbitMQ module pip insta ...
- C#面向对象之数据库(理论、插入、修改、删除、查询)
1.数据库的作用:不仅仅是存储,更重要的是将数据进行存储以后怎么样才能方便快捷的查询修改 2.数据库的特点:海量存储.查找速度快.并发性问题控制.安全性.数据完整性(保存在数据库中的数据是正确的.真是 ...