Qual é a diferença entre @Basic(optional = false)
e @Column(nullable = false)
na persistência JPA?
Qual é a diferença entre @Basic(optional = false)
e @Column(nullable = false)
na persistência JPA?
Respostas:
Gordon Yorke (EclipseLink Architecture Committee Member, TopLink Core Technical Lead, JPA 2.0 Expert Group Member) escreveu uma boa resposta sobre este tópico, então, em vez de parafraseá-lo, citarei sua resposta :
A diferença entre
optional
enullable
é o escopo em que são avaliados. A definição de 'optional
' fala sobre propriedades e valores de campo e sugere que esse recurso deve ser avaliado dentro do tempo de execução. 'nullable
' é apenas uma referência às colunas do banco de dados.Se uma implementação escolher implementar
optional
, essas propriedades devem ser avaliadas na memória pelo Provedor de Persistência e uma exceção levantada antes de SQL ser enviada para o banco de dados, caso contrário, quando o uso de 'updatable=false
' 'optional
' violações nunca seria relatado.
@Basic(optional = false) @Column(nullable = false)
A anotação @Basic marca a propriedade como não opcional no nível do objeto Java. A segunda configuração, nullable = false no mapeamento da coluna, é apenas responsável pela geração de uma restrição de banco de dados NOT NULL. A implementação do Hibernate JPA trata ambas as opções da mesma maneira em qualquer caso, então você também pode usar apenas uma das anotações para este propósito.
The @Basic annotation marks the property as not optional on the Java object level.
O que isso significa? Então, só @Basic
é como dizer que fazer a coluna do banco de dados NOT NULL
para essa variável?
Então, tentei a anotação @Basic (opcional = falso) usando JPA 2.1 (EclipseLink) e descobri que a anotação é ignorada no uso real (pelo menos para um campo String). (por exemplo, chamadas de entityManager.persist).
Então fui para a especificação e li sobre isso. Aqui está o que a especificação tem a dizer:
http://download.oracle.com/otndocs/jcp/persistence-2.0-fr-oth-JSpec/
Básico (opcional): se o valor do campo ou propriedade pode ser nulo. Esta é uma dica e não é considerada para tipos primitivos; ele pode ser usado na geração do esquema.
Portanto, acho que esta frase explica o caso de uso real para Basic (opcional), ele é usado na geração de esquema. (Isto é: quando você gera CREATE TABLE SQL a partir de classes Java Entity. Isso é algo que o Hibernate pode fazer, por exemplo.)
optional = false
serve apenas para verificar essa restrição em tempo de execução. nullable = false
cria restrição de banco de dados. Para aplicativos, definir também optional = false
faz sentido, porque é avaliado mais rápido do que ir para o banco de dados e verificar a restrição lá ..