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:
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;
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ê pode usar @PrePersistanotação e definir o valor padrão no estágio pré-persistente.
Algo parecido:
//... some codeprivateString myProperty;//... some code@PrePersistpublicvoid 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.publicString getMyProperty(){return myProperty;}publicvoid 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.
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?
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]
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:
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
Você pode usar o construtor de classe java para definir os valores padrão. Por exemplo:
publicclassEntityimplementsSerializable{privateDouble field1
privateInteger field2;private T fieldN;publicEntity(){this.field1=0.0;this.field2=0;...this.fieldN=<your default value>}//Setters and Getters...}
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:
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")privateLocalDateTime 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)privateLocalDateTime 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 .
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;
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á.
@ColumnDefault
Respostas:
Se você deseja um valor padrão do banco de dados real, use
columnDefinition
:Observe que a cadeia de caracteres
columnDefinition
é dependente do banco de dados. Além disso, se você escolher esta opção, precisará usardynamic-insert
, paraHibernate
não incluir colunas comnull
valores 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;
fonte
org.hibernate.annotations.Entity
está obsoleto.@DynamicInsert
anotação deve ser usada em seu lugar.Você pode usar
@PrePersist
anotação e definir o valor padrão no estágio pré-persistente.Algo parecido:
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.
fonte
setMyProperty
não é usado pelo seu exemplo. Por que você inclui?que tal apenas definir um valor padrão para o campo?
se eles passarem um valor, ele será substituído, caso contrário, você terá um padrão.
fonte
usar anotação de hibernação
fonte
Se você quiser fazer isso no banco de dados:
Defina o valor padrão no banco de dados (amostra do servidor sql):
Mapeando arquivo de hibernação:
Veja, a chave é insert = "false" update = "false"
fonte
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:
fonte
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
Se você estiver usando columnDefination, pode ser que a anotação @Column não funcione, pois depende do banco de dados.
fonte
Use
@ColumnDefault()
anotação. Isso é hibernado apenas.fonte
Trabalhando com Oracle, eu estava tentando inserir um valor padrão para um Enum
Eu achei o seguinte para funcionar melhor.
fonte
Você pode usar o construtor de classe java para definir os valores padrão. Por exemplo:
fonte
Para usar o valor padrão de qualquer coluna da tabela. então você deve definir
@DynamicInsert
como verdadeiro ou apenas definir@DynamicInsert
. Porque o hibernate leva por padrão como verdadeiro. Considere como o exemplo dado:fonte
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
createdOn
atributo de entidade padrão para o horário atual, assim: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
columnDefinition
atributo da@Column
anotação JPA , assim:A
@Generated
anotaçã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á aDEFAULT
cláusula SQL em um script, em vez de em uma anotação JPA.fonte
fonte
estou trabalhando com o hibernate 5 e o postgres, e isso funcionou comigo.
fonte
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;
fonte
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á.
fonte