Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Default value not working in hibernate

Tags:

java

hibernate

I have use columnDefinition to specify default value for a column, however it does not store default value it stores null only,

Please help regarding this, below is my code

private String sourceFrom;
@Column(name = "SourceFrom", columnDefinition = "varchar(15) default 'Case'")
public String getSourceFrom() {
    return sourceFrom;
}

public void setSourceFrom(String sourceFrom) {
    this.sourceFrom = sourceFrom;
}
like image 876
commit Avatar asked Feb 24 '14 09:02

commit


People also ask

What is the default value in hibernate?

Default column values in JPA. JPA allows to generate Schema definitions when you set hibernate. hbm2ddl. auto value to create or create-drop or update .

What is columnDefinition in hibernate?

columnDefinition definition: The SQL fragment that is used when generating the DDL for the column.


2 Answers

@Column.columnDefinition is used during DDL phase to create your table and NOT during normal program running; probably you have to work with @DynamicInsert/@DynamicUpdate: this annotations insert (or update) only properties you setted into you POJO and let RDBMS to manage other fields.
A small example

@Entity
class MyTable {
  @Id
  private int code;
  @Column(name = "SourceFrom", columnDefinition = "varchar(15) default 'Case'")
  private String sourceFrom; 
}

and this is the generated code from DDL phase

create table mytable (code integer not null,SourceFrom varchar(15) default 'Case')

MyTable t = new MyTable();
t.setCode(10);
session.save(t);

will do this statement

insert into mytable (code, SourceFrom) values (10,NULL)

MyTable t = new MyTable();
t.setCode(10);
t.setSourceFrom("MANUAL INSERT");
session.save(t);

will do this statement

insert into mytable (code, SourceFrom) values (10,'MANUAL INSERT')

If you annotate MyTable with @DynamicInsert the first example will generate this statement

insert into mytable (code) values (10)

As you can see the value of field SourceFrom is not specified and value inserted into database table is defined by column definition default value ('Case' in this case).

Manual processing of default value (in setter, with @PrePersist or other solution) are still valid.

like image 128
Luca Basso Ricci Avatar answered Nov 14 '22 23:11

Luca Basso Ricci


Your proposed solution should work, but is database dependent, so you might want to check up on whether your syntax actually works with your concrete DB. Another more generic approach is

@PrePersist
void preInsert() {
   if ( getSourceFrom() == null ) { setSourceFrom( "Case" ); }
}

Cheers,

like image 37
Anders R. Bystrup Avatar answered Nov 14 '22 23:11

Anders R. Bystrup