Recebo o seguinte erro ao usar um atributo primitivo em meu objeto de domínio grails:
Null value was assigned to a property of primitive type setter of MyDomain.myAttribute
org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of MyDomain.myAttribute
at grails.orm.HibernateCriteriaBuilder.invokeMethod(HibernateCriteriaBuilder.java:1077)
Respostas:
De acordo com este segmento SO , a solução é usar os tipos de invólucro não primitivos; por exemplo, em
Integer
vez deint
.fonte
Um valor nulo não pode ser atribuído a um tipo primitivo, como int, longo, booleano, etc. Se a coluna do banco de dados que corresponde ao campo em seu objeto pode ser nula, então seu campo deve ser uma classe de invólucro, como Inteiro, Longo, Booleano, etc.
O perigo é que seu código funcionará bem se não houver nulos no banco de dados, mas falhará quando os nulos forem inseridos.
E você sempre pode retornar o tipo primitivo do getter. Ex:
Mas na maioria dos casos, você desejará retornar a classe de wrapper.
Portanto, defina sua coluna DB para não permitir nulos ou use uma classe de invólucro.
fonte
Um tipo primitivo não pode ser nulo. Portanto, a solução é substituir o tipo primitivo pela classe de wrapper primitiva em seu arquivo tableName.java. Tal como:
consulte http://en.wikipedia.org/wiki/Primitive_wrapper_class para encontrar a classe de invólucro de um tipo primivito.
fonte
Vou tentar fazer você entender com a ajuda de um exemplo. Suponha que você tenha uma tabela relacional (STUDENT) com duas colunas e ID (int) e NAME (String). Agora, como ORM, você teria feito uma classe de entidade mais ou menos como a seguinte: -
Vamos supor que a tabela já tenha entradas. Agora, se alguém pedir para você adicionar outra coluna de "AGE" (int)
Você terá que definir os valores padrão como NULL para adicionar outra coluna em uma tabela pré-preenchida. Isso faz com que você adicione outro campo na classe. Agora surge a pergunta se você usará um tipo de dados primitivo ou um tipo de dados wrapper não primitivo para declarar o campo.
ou
você terá que declarar o campo como tipo de dados de wrapper não primitivo porque o contêiner tentará mapear a tabela com a entidade. Conseqüentemente, ele não seria capaz de mapear valores NULL (padrão) se você não declarasse o campo como wrapper e eventualmente emitisse "Valor nulo atribuído a uma propriedade do setter de tipo primitivo" Exceção.
fonte
use Integer como o tipo e forneça setter / getter de acordo.
fonte
Não use primitivas em suas classes de Entidade , use seus respectivos invólucros. Isso vai resolver o problema.
Fora de suas classes de entidade, você pode usar a validação! = Null para o resto do seu fluxo de código.
fonte
Evite totalmente
null
no DB viaNOT NULL
e na entidade do Hibernate via@Column(nullable = false)
ou useLong
wrapper ao invés de seuslong
primitivos.Um primitivo não é um objeto, portanto, você não pode atribuí
null
-lo.fonte
Existem duas maneiras
null
private int var;
podem ser inicializadas comoprivate Integer var;
fonte
@Dinh Nhat, seu método setter parece errado porque você colocou um tipo primitivo lá novamente e deveria ser:
fonte
Altere o tipo de parâmetro de primitivo para Object e coloque uma verificação nula no setter. Veja o exemplo abaixo
fonte
Mudar para
fonte
Certifique-se de que o campo myAttribute do seu banco de dados contém nulo em vez de zero.
fonte