使用MYSQL中的hibernate注释设置默认值

我在互联网上搜索并看到了关于在mysql中使用hibernate注释在实体类中设置默认值的想法,我已经完成了将默认值设置为具有数据类型整数的列,如下所示。

@Column(name = "COLUMN_NAME", insertable=false, updatable = false, nullable = false, columnDefinition = "int default 1") protected Integer test_id; 

并且工作正常。

但是我还没有看到varchar / string数据类型的任何示例,我在columnDefinition中尝试过不同的类型,比如

 columnDefinition = "TEXT default `TEST`" columnDefinition = "TEXT default TEST" columnDefinition = "varchar(255) default `15-JUL-1980`") columnDefinition = "varchar(255) default 15-JUL-1980") columnDefinition = "varchar default 15-JUL-1980") columnDefinition = "varchar default `15-JUL-1980`") columnDefinition = "CHAR(100) default `15JUL1980`") columnDefinition = "CHAR default `15JUL1980`") 

有长度属性: –

 `length=100, columnDefinition = "CHAR default `15JUL1980`")` 

等等

但在这种情况下,表不是由hibernate创建的,这可能是由于语法错误造成的。 但是,如果我创建的表只包含整数值,则会创建表。

下面的代码行正常工作

 @Column(name = "cname", insertable=false, updatable = false, nullable = false, columnDefinition = "varchar(255) default '15-JUL-1980'") 

columnDefinition是有效的,但它依赖于数据库。
还有许多其他解决方案(使用@PrePersist注释,修改’getters’),但我建议您在DBMS中设置默认值,然后在模型类中使用@ DynamicInsert / @ DynamicUpdate注释。

请参阅下面的示例(Spring数据JPA + Hibernate)。

 // Model class @Entity public class Person { private Integer age; private String name; private String phone; private String address; // setters and getters } // Insert method in service class @Override @Transactional public Person create() { Person createdPerson = new Person(); createdPerson.setAge(20); createdPerson.setName("Foo"); //createdPerson.setPhone("Unknown"); //createdPerson.setAddress("Somewhere"); return personRepository.save(createdPerson); } 

Hibernate将生成以下插入SQL语句。

 INSERT INTO person (age, name, phone, address) VALUES (?, ?, ?, ?) 

你可以看到Hibernate插入不必要的列(电话,地址)。

但是,在将@DynamicInsert注释添加到Model类之后,如下所示,

 @Entity @DynamicInsert public class Person { ... } 

你可以看到Hibernate只插入必要的列。

 INSERT INTO person (age, name) VALUES (?, ?) 

和未经过授权的列(电话,地址)按DBMS默认值设置其值。