Persistência Java / JPA: @Column vs @Basic

119

Qual é a diferença entre @Columne @Basicanotações na JPA? Eles podem ser usados ​​juntos? Eles devem ser usados ​​juntos? Ou um deles é suficiente?

Hosam Aly
fonte

Respostas:

147
  • @Basicsignifica que um atributo deve ser persistido e um mapeamento padrão deve ser usado. Possui parâmetros que permitem especificar se o atributo deve ser carregado lentamente e se é anulável.

  • @Column permite especificar o nome da coluna no banco de dados no qual o atributo deve ser persistido.

Se você especificar um sem o outro, obterá um comportamento padrão que é sensato; portanto, geralmente as pessoas usam apenas um, com exceção de casos especiais.

Portanto, se quisermos um carregamento lento de um atributo e especificar um nome de coluna, podemos dizer

 @Basic(fetch=FetchType.LAZY)
 @Column(name="WIBBLE")

Se tivéssemos o comportamento padrão não preguiçoso, apenas o @Columnteria sido suficiente.

djna
fonte
2
Esta é uma resposta clara. Obrigado. Portanto, presumo que se possa usar @Basicsem @Column, e é por isso que as propriedades optionale nullableexistem em ambos. Estou certo?
Hosam Aly 5/09/09
1
Não pretendo entender completamente a especificação JPA sobre as diferenças entre o valor anulável do @ Basic e o valor anulável do @ Column e o efeito de especificar nenhum, nenhum ou ambos. @ Basic nullable é descrito como uma "dica" relevante para a geração do esquema. @Column anulável é descrito como definindo as características da coluna no banco de dados. Minha prática seria usar o caso @Column.
djna 5/09/09
16
@Basic (opcional) é (deve ser) verificado no tempo de execução pelo provedor de persistência antes de salvar no DB. @Column é uma definição de coluna no banco de dados e é usada para geração de esquema: stackoverflow.com/questions/2899073/…
Piotr Gwiazda
2
'não preguiçoso', chama EAGER. LOL
solvator
7
As anotações JPA podem ser divididas em dois grupos: as anotações relacionais puras versus as anotações de implementação. As anotações relacionais puras contêm: Entidade, Básica, OneToOne, OneToMany, ManyToMany, ... enquanto as anotações de implementação fornecem dicas sobre como mapear o modelo teórico puro para um banco de dados real: Tabela, Coluna ... Na sua pergunta 'Básico 'é uma anotação para fornecer informações sobre o atributo de entidade relacional, enquanto' Coluna 'fornece informações sobre como mapeá-lo para uma coluna do banco de dados.
de Bruno Ranschaert
50

Além da resposta de @ djna , vale a pena notar que @Basicdeve ser comparado com @OneToMany, @ManyToOnee @ManyToMany. Apenas um deles pode ser especificado em qualquer propriedade.

@Columne @JoinColumnpode ser especificado junto com qualquer um deles para descrever as propriedades da coluna do banco de dados.

Esses são dois conjuntos de anotações que podem ser usados ​​juntos, mas apenas uma anotação de cada conjunto pode ser usada por vez.

Hosam Aly
fonte
21

Vale ressaltar que o Basic foi desenvolvido para campos primitivos

http://en.wikibooks.org/wiki/Java_Persistence/Basic_Attributes

Um atributo básico é aquele em que a classe de atributo é um tipo simples, como String, Número, Data ou primitivo. O valor de um atributo básico pode ser mapeado diretamente para o valor da coluna no banco de dados.

Os tipos e conversões suportados dependem da implementação da JPA e da plataforma de banco de dados. Qualquer atributo básico que use um tipo que não mapeie diretamente para um tipo de banco de dados pode ser serializado para um tipo de banco de dados binário.

A maneira mais fácil de mapear um atributo básico na JPA é não fazer nada. Quaisquer atributos que não tenham outras anotações e não façam referência a outras entidades serão mapeados automaticamente como básicos e até serializados, se não um tipo básico. O nome da coluna para o atributo será padronizado, com o mesmo nome do atributo, em maiúsculas.

Gab
fonte
Boa nota. Obrigado.
Hosam Aly 14/05
1
Não, se nenhuma anotação de Coluna for especificada, os valores padrão serão aplicados (o nome será o atributo um).
Gab
2

A anotação @Basic é aplicada às entidades JPA e a @Column é aplicada às colunas do banco de dados O atributo opcional da anotação @Basic define se o campo da entidade pode ser nulo ou não; por outro lado,

  • O atributo anulável da anotação @Column especifica se a coluna do banco de dados correspondente pode ser nula
  • Podemos usar @Basic para indicar que um campo deve ser carregado lentamente
  • A anotação @Column nos permite especificar o nome da coluna do banco de dados mapeado
  • A anotação @Basic marca a propriedade como não opcional no nível do objeto Java. E (anulável = false) no mapeamento da coluna, é responsável apenas pela geração de uma restrição de banco de dados NOT NULL.
Sonu patel
fonte