Hibernate - Default Boolean Value

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?

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()

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 =(

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.

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

[code]public boolean isAtivo() {
return isAtivo;
}

public void setAtivo(boolean ativo) {
isAtivo = ativo;
}[/code]

(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.

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!

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.

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

[quote=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[/quote]
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.

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!

[quote=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![/quote]

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.

é… 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