Como defino um valor padrão no campo Hibernate?
@ColumnDefault
Como defino um valor padrão no campo Hibernate?
@ColumnDefault
Respostas:
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 Hibernate
não incluir colunas com null
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;
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:
//... 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.
setMyProperty
não é usado pelo seu exemplo. Por que você inclui?
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.
usar anotação de hibernação
@ColumnDefault("-1")
private Long clientId;
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"
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;
}
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.
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;
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
...
}
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:
@AllArgsConstructor
@Table(name = "core_contact")
@DynamicInsert
public class Contact implements Serializable {
@Column(name = "status", columnDefinition = "int default 100")
private Long status;
}
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:
@Column(
name = "created_on"
)
private LocalDateTime createdOn = LocalDateTime.now();
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:
@Column(
name = "created_on",
columnDefinition = "DATETIME(6) DEFAULT CURRENT_TIMESTAMP"
)
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;
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á a DEFAULT
cláusula SQL em um script, em vez de em uma anotação JPA.
Para mais detalhes sobre o uso da
@Generated
anotação, consulte este artigo .
<property name="age" type="integer">
<column name="age" not-null="false" default="null" />
</property>
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;
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á.
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}