【问题标题】:Set default values using hibernate annotations in MYSQL在MYSQL中使用hibernate注解设置默认值
【发布时间】: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'"。此外,这应该对您有所帮助:stackoverflow.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 将创建一个新实例时,该变量已设置为默认值。

标签: java 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";
      

      这对我有用!我知道为时已晚,但我希望这会对某人有所帮助!

      【讨论】:

        猜你喜欢
        • 2015-03-22
        • 2019-04-14
        • 2011-03-07
        • 2012-11-15
        • 1970-01-01
        • 2014-11-30
        • 1970-01-01
        • 2018-12-06
        相关资源
        最近更新 更多