Hibernate NAO respeitando default value do mysql

Olá,

Uma coisa simples, porém não consigo resolver.
No banco tenho uma coluna com default value 1. Se dou um INSERT via MySQLQueryBrowser ele respeita esse default value.
Quando instancio a entidade dessa tabela no java e não seto o valor respectivo a essa coluna (pois no banco já existe um default), ele está colocando 0.

Há algo a ser adicionado nas Annotations para corrigir isso?

abs,
André Vendramini

se não me engano, tem uma propriedade na @Column que diz qual é o default value, dá uma olhada

abraço

[quote=Vendramini87]Olá,

Uma coisa simples, porém não consigo resolver.
No banco tenho uma coluna com default value 1. Se dou um INSERT via MySQLQueryBrowser ele respeita esse default value.
Quando instancio a entidade dessa tabela no java e não seto o valor respectivo a essa coluna (pois no banco já existe um default), ele está colocando 0.

Há algo a ser adicionado nas Annotations para corrigir isso?

abs,
André Vendramini[/quote]

se vc anotou corretamente (ou seja, nos METODOS e nao nos FILDS) isso pode ser resolvido facilmente…

[code]public void SuaEntidade {
private Long id;
private Integer colunaEmQuestao;
//outros campos

  @Id @GeneratedValue
  public Long getId() {} 

  //varios getters and/or setters

  //agora vem a parte importante

  public Integer getColunaEmQuestao() {
        return colunaEmQuestao == null ? 1 : colunaEmQuestao;
  }

}[/code]

Caso suas anotacoes nao estejam nos metodos, e sim nos fields, ai vc vai ter q fazer outra abordagem.

[code]public void SuaEntidade {
@Id @GeneratedValue
private Long id;
private Integer colunaEmQuestao = 1;
//outros campos

  //varios getters and/or setters

  //agora vem a parte importante

  public void setColunaEmQuestao(Integer colunaEmQuestao) {
        colunaEmQuestao = colunaEmQuestao == null ? 1 : colunaEmQuestao;
  }

}[/code]

boa sorte

Consegui. Para quem tiver a mesma dúvida: http://blog.tremend.ro/2007/08/27/hibernate-annotations-default-value/

Apesar desse blog falar para colocar os atributos columnDefinition e nullable, eu apenas setei o valor inicial na declaração do atributo na classe:

private int status = 1;

Está certo? Apesar de ter funcionado…

abs,
André Vendramini

/EDITADO/
Olá, Lavieri! Não tinha visto seu post…

Realmente dessa forma funciona também, porém, preciso colocar a lógica no Java mesmo? Então não “serve para nada” setar default value no banco?

[quote=Vendramini87]Consegui. Para quem tiver a mesma dúvida: http://blog.tremend.ro/2007/08/27/hibernate-annotations-default-value/

Apesar desse blog falar para colocar os atributos columnDefinition e nullable, eu apenas setei o valor inicial na declaração do atributo na classe:

private int status = 1;

Está certo? Apesar de ter funcionado…

abs,
André Vendramini

/EDITADO/
Olá, Lavieri! Não tinha visto seu post…

Realmente dessa forma funciona também, porém, preciso colocar a lógica no Java mesmo? Então não “serve para nada” setar default value no banco?[/quote]

serve… serve pra quem for dar um insert sem o valor, ai ele setao valor…

o fato é

private int status; //esse trecheo é exatamente igual o abaixo private int status = 0; //esse trecho é exatamente igual o de cima;

primitivos sempre tem valores defaults

porem deixar apenas o banco popular é errado, pois

seuObjeto.getStatus() … vai vim o valor zero, ate vc persistir, e ai ao persistir vai virar 1 … o que pode não estar conforme com sua lógica

Exemplo de possível defaultValue…

public class TesteDefaultValue{
    @Id
    @Column(name= "ID")
    private int id;
    @Basic(optional = false)
    @Column(name = "VALOR")
    private BigDecimal valor

    public TesteDefaultValue()
    {
    }

    public int getId()
    {
        return id;
    }

    public void setId(int id)
    {
        this.id = id;
    }

    public BigDecimal getValor()
    {
        return valor;
    }

    //O ESQUEMA ESTÁ AQUI NO SETTER....
    public void setValor(BigDecimal valor)
    {
        //Realize a verificação que desejar antes de setar o this.valor.
        //no caso abaixo estou verificando se o valor for null, então ele será ZERO,
        //pois no banco de dados esta colula é notNull.
        valor = valor==null?BigDecial.ZERO:valor;
        this.valor = valor;
    }

}

Espero ter ajudado, pelo menos comigo funciona muito bem, principalmente quando se usa BeansBinding…