Hibernate - Default Boolean Value

11 respostas
Kura

Opa, pessoal! Como tá esse fim de ano?
Galera, estou com um probleminha aqui.
Estava procurando como setar um valor boolean default numa determinada coluna e consegui criar a coluna com o valor que eu queria.

Fiz assim:

@Column(columnDefinition = "boolean default true") private boolean isAtivo;

Estou usando o mysql, então a coluna é criada como tipo tinyint e valor 1 quando true e 0 quando false.
Blz.
Setei tudo como true.
Mas na hora de trazer uma lista de objetos, o isAtivo sempre está como false! independentemente de estar 0 ou 1 no banco.

Alguem sabe como resolver isso?

11 Respostas

Rodrigo_Sasaki

Na hora de gravar ele grava corretamente?

Só uma outra dica, é bem estranho ter o atributo com o nome isAtivo, se for criar o getter ele vai ficar como getIsAtivo() ou então o pior isIsAtivo()

Kura

nossa! é verdade.
malditas IDEs que me deixam viciado e acabo nem lendo certos códigos gerados. lol
realmente fica estranho. Consertarei.

Olha… Eu não tentei gravar ainda.
A primeira etapa era trazer a lista. A partir dela, eu selecionaria um registro e “deletaria”, sendo que esse delete seria colocar o ativo = false.
Só que a questão é a que eu falei ali… Apesar de criar corretamente no banco, na hora de montar o objeto, ele retorna sempre false =(

Rodrigo_Sasaki

talvez seja esse o problema, ele não está realmente “mapeado” com o campo da tabela, então não carrega nada, e como o valor padrão de um boolean é false, é assim que ele fica.

Kura

eu vi aqui e, apesar de eu ter posto o nome do atributo como isAtivo, o IntelliJ bonitão gerou certinho:

public boolean isAtivo() {
    return isAtivo;
}

public void setAtivo(boolean ativo) {
    isAtivo = ativo;
}

(mas mudei o nome do atributo de qq forma)

IntelliJ pra presidente!

Bom. Vou tentar ver aqui o que tá acontecendo. Qq coisa eu posto a solução.

Muito obrigado pela atenção.

Kura

bom. resolvi.
Acho que não ficou da maneira mais “correta”, mas vamos lá:

O atributo ficou assim:

@Type(type = "yes_no") private boolean ativo = true;

no listAll() do meu dao, eu busco “where ativo = true”.
Assim funcionou.

Caso achem que ficou feioso, aceito sugestões! =)

Rodrigo, mais uma vez: Obrigado!

Rodrigo_Sasaki

Bom, na verdade na verdade você poderia fazer assim:private boolean ativo = trueE seu valor padrão agora seria true, o que acaba até sendo uma solução mais simples pra você, já que o JPA não tem uma anotação @DefaultValue ou algo do tipo.

Se não fosse um tipo primitivo seria um pouco mais complexo, e podemos até discutir isso depois se quiser, mas pro seu caso eu acho que setar o valor no modelo é mais fácil do que usar anotações específicas.

Kura

hmmm vc respondeu antes de ver minha msg editada?
pq logo depois que postei, vi que o “= true” resolveria meu problema de default.
Botei a @Type pra ficar mais legível pra quem for mexer no banco, mas já estou pensando em tira-la pq não quero atrelar o código ao hibernate o.o

Rodrigo_Sasaki

Kura:
hmmm vc respondeu antes de ver minha msg editada?
pq logo depois que postei, vi que o “= true” resolveria meu problema de default.
Botei a @Type pra ficar mais legível pra quem for mexer no banco, mas já estou pensando em tira-la pq não quero atrelar o código ao hibernate o.o

Eu acho essa uma boa pedida, não precisa deixar isso se realmente não é necessário.
Eu sei que é bem raro ter que trocar o provider do JPA, mas também não custa nada manter tudo na especificação onde for possível, não é mesmo?

Agora tome cuidado ao setar valores padrão em objetos por exemplo, isso pode atrapalhar mais do que ajudar.

Kura

Isso! Não custa nada! =P

Pois é, cara. Eu não costumo setar não.
Tá certo que comecei a trabalhar com JAVA há pouquíssimo tempo, mas é a primeira vez que faço isso.
E, NESSE CASO, eu acho que é necessário.

Muito obrigado pela dica! =D
Vc sempre me ajudando bastante. Valeu mesmo! \o/
E, caso a gente não se esbarre até lá, ótimo ano novo pra ti!

Rodrigo_Sasaki

Kura:
Isso! Não custa nada! =P

Pois é, cara. Eu não costumo setar não.
Tá certo que comecei a trabalhar com JAVA há pouquíssimo tempo, mas é a primeira vez que faço isso.
E, NESSE CASO, eu acho que é necessário.

Muito obrigado pela dica! =D
Vc sempre me ajudando bastante. Valeu mesmo! \o/
E, caso a gente não se esbarre até lá, ótimo ano novo pra ti!

Opa, bom ano novo pra você também :slight_smile:

Não fique preocupado com o que você fez, que na minha opinião é o mais correto a se fazer nesse caso.
A especificação JPA não tem nada que te permita setar valores padrão como você quer, então você tem várias possibilidades:

:arrow: Utilizar columnDefinition, mas essa é uma solução que dizem ser vendor specific, porque você pode ter que escrever um DDL específico do banco sendo utilizado, então não é a melhor solução.

:arrow: Setar o valor no modelo como você fez (ou no construtor), pois assim sempre que um objeto desse tipo for criado, o atributo terá esse valor, fazendo dele assim, padrão. Essa solução é melhor para tipos primitivos

:arrow: Utilizar métodos de callback (método anotado com @PrePersist), e nesse caso seu, não teria como fazer, pois como você saberia se o valor que está lá é o padrão, ou foi setado pelo usuário? Não teria como fazer essa verificação com uma variável do tipo boolean, essa solução é melhor para tipos não-primitivos.

Kura

é… eu tinha usado o columnDefinition, mas li a mesma coisa pesquisando sobre ele.
e pra quem não quer atrelar nem o hibernate, atrelar ao banco é um pecado mortal.

sobre o callback, eu vou pesquisar um pouco mais a usabilidade pra entender melhor as vantagens e quando usar =D
nunca usei. eu até tinha visto essa anotation @PrePersist em alguma das minhas jornadas de estudo, mas só vi mesmo. huahuahuha

Criado 27 de dezembro de 2012
Ultima resposta 28 de dez. de 2012
Respostas 11
Participantes 2