Column
Explicação
@Column
A anotação @Column no JPA é usada para mapear um atributo da entidade para uma coluna específica em uma tabela de banco de dados. Ela permite personalizar a forma como o atributo da entidade é tratado na tabela, seja em termos de nome, tamanho, tipo de dados ou outras restrições.
Abaixo, explico os detalhes da anotação @Column e como ela pode ser aplicada à entidade Cliente fornecida.
Objetivo da anotação @Column
A anotação @Column permite configurar vários aspectos do mapeamento entre atributos da entidade e as colunas da tabela no banco de dados. Entre os principais aspectos que você pode configurar com @Column, temos:
- Nome da coluna (
name) - Tamanho da coluna (
length) - Se a coluna pode ser 
null(nullable) - Se a coluna é única (
unique) - Se a coluna é indexada (
insertable,updatable) - Tipo de dado da coluna (
columnDefinition,precision,scale) 
Exemplo básico
Aqui está a versão da classe Cliente com a anotação @Column aplicada aos atributos, usando as opções mais comuns para personalizar o mapeamento entre os atributos da classe e as colunas da tabela:
@Entity
public class Cliente {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)  // Definindo uma chave primária gerada automaticamente
    @Column(name = "id_cliente")  // Personalizando o nome da coluna para "id_cliente"
    private Integer id;
    @Column(name = "cpf_cnpj", length = 18, nullable = false, unique = true)  // Define o nome, o tamanho, torna não-nulo e único
    private String cpfCnpj;
    @Column(name = "nome_completo", length = 100, nullable = false)  // Define o nome e o tamanho da coluna
    private String nomeCompleto;
    @Column(name = "email", length = 100, nullable = false, unique = true)  // Define o nome, o tamanho e a unicidade
    private String email;
    @Column(name = "aniversario")  // O nome da coluna será o mesmo que o nome do atributo por padrão
    private LocalDate aniversario;
    @Column(name = "renda_mensal", precision = 10, scale = 2)  // Define a precisão e a escala para um número decimal
    private Double rendaMensal;
    @Column(name = "ativo", nullable = false)  // Torna a coluna 'ativo' não-nula
    private boolean ativo;
    
    // Lombok ou Getters e Setters
}
Atributos Comuns
name:
- Descrição: Define o nome da coluna no banco de dados. Caso não seja especificado, o JPA usará o nome do atributo da entidade como o nome da coluna.
 - Exemplo:
@Column(name = "cpf_cnpj") private String cpfCnpj; 
length:
- Descrição: Define o tamanho máximo da coluna. Esse parâmetro é relevante principalmente para colunas de tipos como 
String(ouVARCHAR). Por padrão, o comprimento de umaStringé 255 caracteres, mas você pode definir um tamanho menor. - Exemplo:
@Column(name = "nome_completo", length = 100) private String nomeCompleto; 
nullable:
- Descrição: Define se a coluna pode ou não ser 
null. O valor padrão étrue, ou seja, a coluna pode sernull. Se você definir comofalse, o banco de dados vai garantir que o campo tenha um valor não-nulo. - Exemplo:
@Column(name = "email", nullable = false) private String email; 
unique:
- Descrição: Indica que os valores dessa coluna devem ser únicos no banco de dados. Isso cria uma restrição de unicidade para a coluna.
 - Exemplo:
@Column(name = "cpf_cnpj", unique = true) private String cpfCnpj; 
insertableeupdatable:
- Descrição: Controlam se o valor da coluna pode ser inserido ou atualizado. Se configurados como 
false, significa que a coluna será ignorada durante as operações de inserção e/ou atualização. - Exemplo:
@Column(name = "ativo", insertable = false, updatable = false) private boolean ativo; // Este campo não será inserido ou atualizado diretamente 
precisionescale:
- Descrição: São usados para colunas numéricas (como 
BigDecimalouDouble), especificando a precisão (número total de dígitos) e a escala (número de dígitos após o ponto decimal). - Exemplo:
@Column(name = "renda_mensal", precision = 10, scale = 2) private Double rendaMensal; 
columnDefinition:
- Descrição: Permite especificar a definição completa da coluna, como o tipo de dado exato (por exemplo, 
VARCHAR(255),TEXT,INT). - Exemplo:
@Column(name = "aniversario", columnDefinition = "DATE") private LocalDate aniversario; 
insertableeupdatable:
- Descrição: Controlam se a coluna pode ser inserida ou atualizada diretamente. Por exemplo, se um atributo é calculado ou mantido por outro processo, ele pode ser marcado como não inserível ou não atualizável.
 - Exemplo:
@Column(name = "ativo", insertable = false, updatable = false) private boolean ativo; 
Funcionalidades
name: Define o nome da coluna no banco de dados.length: Define o tamanho da coluna para tipos de dados comoString.nullable: Define se a coluna pode ser nula.unique: Define se os valores da coluna devem ser únicos.insertable/updatable: Define se a coluna será inserida ou atualizada.precision/scale: Define a precisão e escala para valores numéricos (usado principalmente paraBigDecimal).columnDefinition: Define a definição completa do tipo da coluna no banco de dados.
Usando @Transient
A anotação @Transient no JPA é utilizada para indicar que um atributo não deve ser persistido na tabela do banco de dados. Ou seja, quando você usa @Transient, o JPA ignora o campo durante o processo de persistência (inserção, atualização, exclusão) e não tentará mapear esse campo para uma coluna na tabela do banco de dados.
Quando usar @Transient ?
Você deve usar @Transient quando quiser que o atributo seja somente leitura, mas não tenha nenhuma relação com o banco de dados (ou seja, você não quer que o campo seja persistido de forma alguma). Isso é útil, por exemplo, para campos calculados dinamicamente, ou para informações que são necessárias para o funcionamento da aplicação, mas não fazem parte do modelo de dados persistido.
@Entity
public class Cliente {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column(name = "renda_mensal", precision = 10, scale = 2)
    private Double rendaMensal;
    @Transient  // Este campo não será persistido no banco de dados
    private Double rendaAnual;
    public Double getRendaAnual() {
        this.rendaAnual = this.rendaMensal * 12;
        return this.rendaAnual;
    }
    // Getters e setters
}
Nesse exemplo:
- O atributo 
rendaMensalé persistido normalmente na tabela. - O atributo 
rendaAnualé calculado dinamicamente com base no valor de rendaMensal, mas não é persistido nem no banco de dados nem na tabela. A anotação @Transient indica explicitamente que o atributo não será mapeado para nenhuma coluna. 
Conclusão
A anotação @Column oferece um controle detalhado sobre como os atributos de uma entidade serão mapeados para colunas de uma tabela no banco de dados. Ela permite especificar o nome da coluna, restrições de unicidade, tamanho, se a coluna pode ser null, entre outras características. Ao utilizá-la corretamente, você pode garantir que as entidades da sua aplicação sejam mapeadas de maneira eficiente e conforme os requisitos do banco de dados.