3
votes

I have searched on internet and seen ideas about setting default values in entity class using hibernate annotations in mysql and I have done with setting default values to column with datatype integer only as follows.

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

and is working fine.

But I haven't seen any example for varchar/string datatype and I have try with different types in columnDefinition like,

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`")

With length attribute:-

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

etc.

but in this case table is not created by hibernate, that may be due to wrong syntax. But if I am creating the table with only integer values as above table is created.

3
enclose 15-JUL-1980 within quotes, like columnDefinition = "varchar(255) default '15-JUL-1980'". Additionally, this should help you: stackoverflow.com/questions/197045/…Alex
Thanks Alex and your right. Actually I was changing existing table with modifying entity class, but it's working after doping existing table and let hibernate to create new table. After table drop and fresh run of application is working with[ @Column(name = "cname", insertable=false, updatable = false, nullable = false, columnDefinition = "varchar(255) default '15-JUL-1980'") ] fine.Tulshiram Pawde
This is working with new table only, but is there any Idea about to apply changes to existing table.Tulshiram Pawde
For existing table, and new insertion/update you can set directly the default value in Java like this @Column(.., columnDefinition = "varchar(255) default '15-JUL-1980'") private String myVar = "15-JUL-1980";. When Hibernate will create a new instance, the variable is already set with a default value.Alex

3 Answers

13
votes

Below line of code is working fine

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

columnDefinition is works, but it is database dependent.
and there are many other solution(Using @PrePersist annotation, modifying 'getters'), but I recommend you set default value in DBMS, then use @DynamicInsert/@DynamicUpdate annotations in model class.

See example below(Spring data 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 will generate following insert SQL statement.

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

you can see Hibernate insert unnecessary columns(phone, address), too.

but, after add @DynamicInsert annotation to Model class like below,

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

you can see Hibernate insert only necessary columns.

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

and uninitilized columns(phone, address) set their value by DBMS default value.

0
votes

simply set default value in your Java code, just initialize your variable like this - private int myColumn = 100; and String as

@Column(name="order_status" , length=10 )
private String orderStatus = "Pending";

it's work for me !! i know it's too late but i hope this will help someone !!