在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注解设置默认值的主要内容,如果未能解决你的问题,请参考以下文章

hibernate用注解配置实体类的映射

Jpa设置默认值约束

mysql中timestamp类型 我设置了默认值 为啥java中添加时间类型还是null 在数据库中可以

MYSQL 和 Hibernate:插入默认值 0 而不是“null”

Hibernate,JPA注解@DynamicInsert和@DynamicUpdate

hibernate中注解方式中的控制反转