Explique sobre insertable = false e atualizável = false em referência à anotação JPA @Column

151

Se um campo é anotado insertable=false, updatable=false, isso não significa que você não pode inserir valor nem alterar o valor existente? Por que você gostaria de fazer isso?

@Entity
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToMany(mappedBy="person", cascade=CascadeType.ALL)
    private List<Address> addresses;
}

@Entity
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne
    @JoinColumn(name="ADDRESS_FK")
    @Column(insertable=false, updatable=false)
    private Person person;
}
Thang Pham
fonte

Respostas:

121

Você faria isso quando a responsabilidade de criar / atualizar a entidade relacionada em questão não estiver na entidade atual . Por exemplo, você tem um Persone um Address. Você gostaria de adicionar insertable=false, updatable=falseao @OneToManyrelacionamento com a Personentidade na Addressentidade, simplesmente porque não é responsabilidade da Addressentidade criar ou atualizar a Person. É o contrário.

BalusC
fonte
Refere-se à definição insertable=false,updatable=falsede um dos lados do relacionamento.
precisa saber é o seguinte
3
Você está dizendo que, com atualizável = false em Pessoa, desabilitará a atualização de Person.name ao atualizar o endereço (eu discordo, pois esse é o objetivo da cascata). Você também está dizendo que a definição @Column faz algo diferente quando sua chave estrangeira (Person) e quando não é uma chave estrangeira (como não há uma entidade referenciada para desativar a atualização). Ao ler o javadoc para atualizável, eu diria que ele apenas desabilitará a alteração de Person para determinado endereço, se persistir uma vez. Você pode explicar por favor?
Flowy 03/10/19
8
Eu acho que você quis dizer ... to the @ManyToOne relationship with the ...??
Martin Konecny
111

A definição insertable=false, updatable=falseé útil quando você precisa mapear um campo mais de uma vez em uma entidade, normalmente:

Isso é IMO, não semântico, mas definitivamente técnico.

Pascal Thivent
fonte
15
Eu acredito firmemente que esta resposta é muito melhor que a aceita. A resposta aceita transmite a sensação de que o atributo inserível / atualizável tem a ver com a criação / atualização da entidade relacionada, enquanto a real intenção por trás desses atributos é impedir a inserção / atualização da coluna na entidade atual. A criação / atualização da entidade relacionada é abordada pelo atributo em cascata da anotação de mapeamento.
Jayant
25

Gostaria de acrescentar às respostas de BalusC e Pascal Thivent outro uso comum de insertable=false, updatable=false:

Considere uma coluna que não é um ID, mas algum tipo de número de sequência . A responsabilidade pelo cálculo do número de sequência pode não necessariamente pertencer ao aplicativo.

Por exemplo, o número de sequência começa com 1000 e deve ser incrementado em um para cada nova entidade. Isso é fácil e muito apropriado no banco de dados e, nesses casos, essas configurações fazem sentido.

Magnilex
fonte
1
As sequências também são suportadas pela JPA, portanto, você também pode definir sua sequência com anotações da JPA.
eis
8

Um outro exemplo seria na coluna "created_on", na qual você deseja permitir que o banco de dados lide com a criação da data

Johny19
fonte
O Hibernate deve bloquear atualizações com base em uma anotação atualizável = falsa? No meu teste de repositório JPA, uma coluna created_on com esta anotação aceita atualizações sem reclamação.
chrisinmtown
1
@chrisinmtown O Eclipselink não incluirá a coluna no sql. Eu espero que seja o mesmo com o Hibernate
Jaqen H'ghar