在MYSQL中使用hibernate注解设置默认值
Posted
技术标签:
【中文标题】在MYSQL中使用hibernate注解设置默认值【英文标题】:Set default values using hibernate annotations in MYSQL 【发布时间】:2012-10-15 18:14:46 【问题描述】:我在互联网上搜索并看到了有关在 mysql 中使用休眠注释在实体类中设置默认值的想法,并且我已经将默认值设置为仅具有数据类型整数的列,如下所示。
@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`")`
等等
但在这种情况下,表不是由休眠创建的,这可能是由于语法错误。 但是,如果我创建的表只有整数值,则创建上表。
【问题讨论】:
用引号将15-JUL-1980
括起来,例如columnDefinition = "varchar(255) default '15-JUL-1980'"
。此外,这应该对您有所帮助:***.com/questions/197045/…
感谢亚历克斯和您的权利。实际上我正在通过修改实体类来更改现有表,但是在掺杂现有表并让休眠创建新表之后它正在工作。在表删除和新运行的应用程序正在使用 [@Column(name = "cname", insertable=false, updatable = false, nullable = false, columnDefinition = "varchar(255) default '15-JUL-1980'") ] 很好。
这仅适用于新表,但是否有任何想法将更改应用于现有表。
对于现有表,以及新的插入/更新,您可以直接在 Java 中设置默认值,如 @Column(.., columnDefinition = "varchar(255) default '15-JUL-1980'") private String myVar = "15-JUL-1980";
。当 Hibernate 将创建一个新实例时,该变量已设置为默认值。
【参考方案1】:
下面一行代码运行良好
@Column(name = "cname", insertable=false, updatable = false, nullable = false, columnDefinition = "varchar(255) default '15-JUL-1980'")
【讨论】:
【参考方案2】: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 注释后,如下所示,
@Entity
@DynamicInsert
public class Person
...
你可以看到 Hibernate 只插入必要的列。
INSERT INTO person (age, name)
VALUES (?, ?)
和未初始化的列(电话、地址)通过 DBMS 默认值设置它们的值。
【讨论】:
【参考方案3】:只需在您的 Java 代码中设置默认值,只需像这样初始化您的变量 - private int myColumn = 100;
和 String as
@Column(name="order_status" , length=10 )
private String orderStatus = "Pending";
这对我有用!我知道为时已晚,但我希望这会对某人有所帮助!
【讨论】:
以上是关于在MYSQL中使用hibernate注解设置默认值的主要内容,如果未能解决你的问题,请参考以下文章
mysql中timestamp类型 我设置了默认值 为啥java中添加时间类型还是null 在数据库中可以
MYSQL 和 Hibernate:插入默认值 0 而不是“null”