@Basic (opcional = falso) vs @Column (nullable = false) em JPA


Respostas:


98

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 optionale nullableé 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.


8
Então, o que realmente deve ser usado, talvez os dois?
Xiè Jìléi,

39
@Xie Jilei: Do livro: Java persistence with hibernate 2007, p. 179: @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.
arrebatado

2
@rapt - Eu não entendo 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 NULLpara essa variável?
Erran Morad

9
Isso significa que, se você tentar persistir uma entidade com um campo nulo, ela lançará uma exceção se estiver marcada como opcional = falso (sem entrar em contato com o banco de dados) e a entidade não será incluída no contexto de persistência JPA. Se for apenas anotado como nullable = false, a entidade será adicionada ao contexto de persistência e ao tentar gravar a entidade no banco de dados (por exemplo, via flush), ele tentará gravar a entidade no banco de dados, o que negará isso e ele lançará uma exceção então.
Ray Hulha

@RayHulha Eu tentei anotar um campo com "@Basic (opcional = falso)" e adicionei uma tupla ao banco de dados (com o valor deste campo = null), nenhuma exceção foi levantada !!, espero que você possa explicar para mim esse comportamento.
ziMtyth de

4

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


1
É engraçado que a outra resposta implica que é anulável e não Basic que é usado para geração de esquema (quando diz «'anulável' é apenas em referência às colunas do banco de dados»). Ainda é muito confuso. Eu acho que anulável é usado para geração de esquema e Basic (opcional = false) pode ser usado para a mesma finalidade? Isso faz sentido?
marcus,

optional = falseserve apenas para verificar essa restrição em tempo de execução. nullable = falsecria restrição de banco de dados. Para aplicativos, definir também optional = falsefaz sentido, porque é avaliado mais rápido do que ir para o banco de dados e verificar a restrição lá ..
nimo23
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.