Como definir um valor de propriedade da entidade padrão com o Hibernate

145

Como defino um valor padrão no campo Hibernate?

Dejell
fonte
3
Você está usando o arquivo de configuração XML ou anotações?
Bruno
2
A resposta abaixo fornece apenas soluções JPA, que estão corretas, mas para uma solução Hibernate, consulte stackoverflow.com/questions/28107554/… que você deve usar@ColumnDefault
pdem

Respostas:

185

Se você deseja um valor padrão do banco de dados real, use columnDefinition:

@Column(name = "myColumn", nullable = false, columnDefinition = "int default 100") 

Observe que a cadeia de caracteres columnDefinitioné dependente do banco de dados. Além disso, se você escolher esta opção, precisará usar dynamic-insert, para Hibernatenão incluir colunas com nullvalores na inserção. Caso contrário, falar sobre o padrão é irrelevante.

Mas se você não deseja o valor padrão do banco de dados, mas simplesmente um valor padrão no seu código Java, basta inicializar sua variável assim - private Integer myColumn = 100;

Petar Minchev
fonte
6
Com anotações: @ org.hibernate.annotations.Entity (dynamicInsert = true)
homaxto 14/03
9
Atualmente org.hibernate.annotations.Entityestá obsoleto. @DynamicInsertanotação deve ser usada em seu lugar.
2113
1
Eu não recomendaria o uso de columnDefinition para essa situação, isso não é portátil de um banco de dados para outro e você precisa conhecer a linguagem SQL específica do seu servidor.
pdem 20/09/16
O @DynamicInsert precisa ser adicionado à classe pojo do banco de dados.
você precisa saber é o seguinte
3
Eu recomendo o uso de @ColumnDefault em vez de columnDefinition, pois é mais independente de banco de dados docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/…
jalsh
35

Você pode usar @PrePersistanotação e definir o valor padrão no estágio pré-persistente.

Algo parecido:

//... some code
private String myProperty;
//... some code

@PrePersist
public void prePersist() {
    if(myProperty == null) //We set default value in case if the value is not set yet.
        myProperty = "Default value";
}

// property methods
@Column(nullable = false) //restricting Null value on database level.
public String getMyProperty() {
    return myProperty;
}

public void setMyProperty(String myProperty) {
    this.myProperty= myProperty;
}

Este método não depende do tipo / versão do banco de dados abaixo do Hibernate. O valor padrão é definido antes de persistir o objeto de mapeamento.

dbricman
fonte
Dado que setMyPropertynão é usado pelo seu exemplo. Por que você inclui?
precisa
Eu apenas cito o exemplo de anotações de hibernação para a propriedade java padrão (variável privada com métodos públicos get / set). Percebi e corrigi um erro ... Faltava o tipo String do método set argumet.
27618 dbricman
30

que tal apenas definir um valor padrão para o campo?

private String _foo = "default";

//property here
public String Foo

se eles passarem um valor, ele será substituído, caso contrário, você terá um padrão.

Tim Hoolihan
fonte
8
@michali: o papel de um valor padrão não está impedindo a atualização do valor, é?
Janusz Lenar 12/09
27

usar anotação de hibernação

@ColumnDefault("-1")
private Long clientId;
Mazen Embaby
fonte
Obrigado, funciona. Mas eu tive que recriar a mesa.
Yamashiro Rion
1
Essa deve ser a solução real, usar columnDefinition, conforme proposto pela resposta atual, é um obstáculo e você deve incluir o tipo. A anotação @ColumnDefault é muito mais fácil na minha opinião.
judos 23/01
7

Se você quiser fazer isso no banco de dados:

Defina o valor padrão no banco de dados (amostra do servidor sql):

ALTER TABLE [TABLE_NAME] ADD  CONSTRAINT [CONSTRAINT_NAME]  DEFAULT (newid()) FOR [COLUMN_NAME]

Mapeando arquivo de hibernação:

    <hibernate-mapping ....
    ...    
    <property name="fieldName" column="columnName" type="Guid" access="field" not-null="false"  insert="false" update="false"  />
    ...

Veja, a chave é insert = "false" update = "false"

CSA
fonte
Há um problema para o Oracle: se a propriedade não for nula, seu valor AINDA será o valor padrão. Não é o valor real.
youngzy
5

Uma solução é fazer com que seu getter verifique se qualquer valor com o qual você está trabalhando é nulo (ou qualquer que seja seu estado não inicializado) e se é igual a isso, basta retornar seu valor padrão:

public String getStringValue(){
     return (this.stringValue == null) ? "Default" : stringValue;
}
Ian Dallas
fonte
Estou usando um mapeador que chama o setter no meu objeto de entidade. Existe uma desvantagem em usar seu snippet de código no getter e no setter?
Eric Francis
4

Procurei por isso e encontrei muitas respostas para o valor padrão da coluna. Se você deseja usar o valor padrão definido na Tabela SQL e, em Anotação @Column, use " insertable = false" . inserível

@Column (nome = columnName, comprimento = lengthOfColumn, inserível = false)

Se você estiver usando columnDefination, pode ser que a anotação @Column não funcione, pois depende do banco de dados.

Garvit Bansal
fonte
Isso funciona muito bem para colunas como "createdAt", onde você sempre deseja usar o padrão do banco de dados. Obrigado!
Michal Filip
4

Use @ColumnDefault()anotação. Isso é hibernado apenas.

T3rm1
fonte
2

Trabalhando com Oracle, eu estava tentando inserir um valor padrão para um Enum

Eu achei o seguinte para funcionar melhor.

@Column(nullable = false)
@Enumerated(EnumType.STRING)
private EnumType myProperty = EnumType.DEFAULT_VALUE;
Bojan Petkovic
fonte
2

Você pode usar o construtor de classe java para definir os valores padrão. Por exemplo:

public class Entity implements Serializable{
 private Double field1
 private Integer field2;
 private T fieldN;

 public Entity(){
  this.field1=0.0;
  this.field2=0;
  ...
  this.fieldN= <your default value>
 }

 //Setters and Getters
...

}
IKavanagh
fonte
2

Para usar o valor padrão de qualquer coluna da tabela. então você deve definir @DynamicInsertcomo verdadeiro ou apenas definir @DynamicInsert. Porque o hibernate leva por padrão como verdadeiro. Considere como o exemplo dado:

@AllArgsConstructor
@Table(name = "core_contact")
@DynamicInsert
public class Contact implements Serializable {

    @Column(name = "status", columnDefinition = "int default 100")
    private Long status;

}
Dilip Verma
fonte
2

Valor da propriedade da entidade padrão

Se você deseja definir um valor de propriedade da entidade padrão, pode inicializar o campo da entidade usando o valor padrão.

Por exemplo, você pode definir o createdOnatributo de entidade padrão para o horário atual, assim:

@Column(
    name = "created_on"
)
private LocalDateTime createdOn = LocalDateTime.now();

Valor padrão da coluna

Se você estiver gerando o esquema DDL com o Hibernate, embora isso não seja recomendado, você poderá usar o columnDefinitionatributo da @Columnanotação JPA , assim:

@Column(
    name = "created_on", 
    columnDefinition = "DATETIME(6) DEFAULT CURRENT_TIMESTAMP"
)
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;

A @Generatedanotação é necessária porque queremos instruir o Hibernate a recarregar a entidade após a liberação do Contexto de Persistência, caso contrário, o valor gerado pelo banco de dados não será sincronizado com o estado da entidade na memória.

Em vez de usar o columnDefinition, é melhor usar uma ferramenta como Flyway e usar scripts de migração incremental DDL. Dessa forma, você definirá a DEFAULTcláusula SQL em um script, em vez de em uma anotação JPA.

Para mais detalhes sobre o uso da @Generatedanotação, consulte este artigo .

Vlad Mihalcea
fonte
1

estou trabalhando com o hibernate 5 e o postgres, e isso funcionou comigo.

@Column(name = "ACCOUNT_TYPE", ***nullable***=false, columnDefinition="varchar2 default 'END_USER'")
@Enumerated(EnumType.STRING)
private AccountType accountType;
Ala Messaoudi
fonte
0

Se você deseja definir o valor padrão em termos de banco de dados, basta definir @Column( columnDefinition = "int default 1")

Mas se o que você pretende é definir um valor padrão no seu aplicativo java, você pode configurá-lo no seu atributo de classe como este: private Integer attribute = 1;

Edgencio Da Calista
fonte
-3

A sugestão acima funciona, mas apenas se a anotação for usada no método getter. Se as anotações forem usadas onde o membro for declarado, nada acontecerá.

public String getStringValue(){
     return (this.stringValue == null) ? "Default" : stringValue;
}
user1310789
fonte