问题背景
Java开发中,使用Hibernate作为映射数据库的表,所以创建了一个modle类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
| @javax.persistence.Entity
@javax.persistence.Table(name = "HibernateTest")
public class HibernateTest extends BaseModel {
private static final long serialVersionUID = 9124938173965082237L;
private Long id;
private String name;
private Integer age;
@javax.persistence.Id
@javax.persistence.GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY)
@javax.persistence.Column(name = "Id")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@javax.persistence.Column(name = "Name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@javax.persistence.Column(name = "Age")
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
|
对应的数据库,由于DBA要求非字符串字段必须有默认值,则
1
2
3
4
5
6
| CREATE TABLE `HibernateTest` (
`Id` bigint(16) NOT NULL AUTO_INCREMENT COMMENT '主键',
`Name` varchar(32) DEFAULT NULL COMMENT '名称',
`Age` int(8) NOT NULL DEFAULT '-1' COMMENT '年龄',
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
这种情况下,使用Hibernate默认的save或update方法来添加或修改数据,如果有非空约束的字段(比如Age)没有赋值,会抛出异常。
因为Hibernate执行save或update时,会将映射类中的所有映射字段加入到生成的SQL语句中,所以导致数据库报错。
解决方法
在映射类的类名上方,添加注解
1
| @org.hibernate.annotations.Entity(dynamicInsert = true, dynamicUpdate = true)
|
这样Hibernate在执行save或update方法时,映射类中映射字段为NULL的,就不会加入到最后生成的SQL语句中了。