Hazırda Bekletme ile varsayılan varlık özelliği değeri nasıl ayarlanır?


Yanıtlar:


188

Gerçek bir veritabanı varsayılan değeri istiyorsanız, şunu kullanın columnDefinition:

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

İçindeki dizenin columnDefinitionveritabanına bağlı olduğuna dikkat edin . Ayrıca bu seçeneği seçerseniz, kullanmanız gerekir dynamic-insert, bu nedenle Hibernateeklemede nulldeğerleri olan sütunları dahil etmeyin . Aksi takdirde temerrütten bahsetmek alakasızdır.

Ancak veritabanı varsayılan değerini istemiyorsanız, ancak Java kodunuzda yalnızca varsayılan bir değer istiyorsanız, değişkeninizi bu şekilde başlatmanız yeterlidir - private Integer myColumn = 100;


6
Ek açıklamalarla: @ org.hibernate.annotations.Entity (dynamicInsert = true)
homaxto

10
Şu anda org.hibernate.annotations.Entitykullanımdan kaldırılmıştır. @DynamicInsertOnun yerine ek açıklama kullanılmalıdır.
jannis

1
Bu durumda columnDefinition kullanmanızı tavsiye etmem, bu bir veritabanından diğerine taşınabilir değildir ve sunucunuzun belirli SQL dilini bilmeniz gerekir.
pdem

@DynamicInsert'in veritabanı pojo sınıfına eklenmesi gerekiyor.
Reaz Murshed

3
Veritabanından daha bağımsız olduğu için columnDefinition yerine @ColumnDefault kullanmanızı tavsiye ederim docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/…
jalsh

35

@PrePersistAnotasyon kullanabilir ve kalıcılık öncesi aşamada varsayılan değeri ayarlayabilirsiniz.

Bunun gibi bir şey:

//... 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;
}

Bu yöntem, Hazırda Bekletme altındaki veritabanı türüne / sürümüne bağlı değildir. Eşleme nesnesini sürdürmeden önce varsayılan değer ayarlanır.


setMyPropertySizin örneğiniz tarafından kullanılmadığı göz önüne alındığında . Neden dahil ediyorsunuz?
EndermanAPM

Ben sadece standart java özelliği için hazırda bekletme ek açıklamaları örneğini veriyorum (genel get / set yöntemleriyle özel değişken). Bir hatayı fark ettim ve düzelttim ... Küme yöntemi argumet'in dize türü eksikti.
dbricman

31

hazırda bekletme açıklamasını kullan

@ColumnDefault("-1")
private Long clientId;

Teşekkür ederim işe yarıyor. Ama masayı yeniden yaratmak zorunda kaldım.
Yamashiro Rion

2
Bu gerçek çözüm olmalı, şu anki yanıtın önerdiği gibi columnDefinition kullanmak bir aceledir ve türü dahil etmelisiniz. @ColumnDefault ek açıklaması bence çok daha kolay.
judos

30

alan için varsayılan bir değer belirlemeye ne dersiniz?

private String _foo = "default";

//property here
public String Foo

eğer bir değer geçerlerse, üzerine yazılır, aksi takdirde bir varsayılanınız olur.


9
@michali: bir varsayılan değerin rolü, değerin güncellenmesini engellemiyor, değil mi?
Janusz Lenar

7

Veritabanında yapmak istiyorsanız:

Veritabanında varsayılan değeri ayarlayın (sql sunucu örneği):

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

Hazırda bekletme dosyası eşleniyor:

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

Bakın, anahtar insert = "false" update = "false"


Oracle için bir sorun var: Özellik boş değilse, değeri STILL varsayılan değerdir. Gerçek değer değil.
youngzy

5

Çözümlerden biri, alıcınızın çalıştığınız değerin boş olup olmadığını (veya başlatılmamış durumu ne olursa olsun) kontrol etmesini sağlamaktır ve buna eşitse, varsayılan değerinizi döndürmeniz yeterlidir:

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

Varlık nesnemde ayarlayıcıyı çağıran bir eşleyici kullanıyorum. Kod pasajınızı hem alıcıda hem de ayarlayıcıda kullanmanın bir dezavantajı var mı?
Eric Francis

4

Bunu aradım ve sütun için varsayılan değere birçok yanıt buldum. SQL Tablosunda tanımlanan varsayılan değeri kullanmak istiyorsanız @ Sütun Ek Açıklamasında " insertable = false" kullanın . sokulabilir

@Column (ad = sütunAdı, uzunluk = uzunlukOfColumn, eklenebilir = yanlış)

ColumnDefination kullanıyorsanız, @Column ek açıklaması Veritabanına bağlı olduğu için çalışmayabilir.


Bu, her zaman DB varsayılanını kullanmak istediğiniz "createdAt" gibi sütunlar için harika çalışır. Teşekkürler!
Michal Filip

4

@ColumnDefault()Ek açıklama kullanın . Bu yalnızca hazırda bekletme modudur.


4

Varsayılan varlık özelliği değeri

Varsayılan bir varlık özelliği değeri ayarlamak istiyorsanız, o zaman varlık alanını varsayılan değeri kullanarak başlatabilirsiniz.

Örneğin, varsayılan createdOnvarlık özniteliğini şu şekilde geçerli zamana ayarlayabilirsiniz :

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

JPA kullanan varsayılan sütun değeri

DDL şemasını JPA ve Hazırda Bekletme ile oluşturuyorsanız, bu önerilmese columnDefinitionde, JPA @Columnek açıklamasının özniteliğini şu şekilde kullanabilirsiniz :

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

@GeneratedBiz Sebat Bağlam kızardı sonra, aksi takdirde, veritabanı tarafından oluşturulan değer bellek varlık durumuyla senkronize edilmez varlık yeniden Hibernate talimat istiyorum, çünkü açıklama gereklidir.

Kullanmak yerine columnDefinitionFlyway gibi bir araç kullanmanız ve DDL artımlı geçiş komut dosyalarını kullanmanız daha iyi olur. Bu şekilde, DEFAULTSQL yan tümcesini bir JPA ek açıklaması yerine bir komut dosyasında ayarlarsınız .

@GeneratedEk açıklamayı kullanma hakkında daha fazla ayrıntı için bu makaleye göz atın .

Hazırda Bekletme kullanılarak varsayılan sütun değeri

Hazırda Bekletme ile JPA kullanıyorsanız, @ColumnDefaultek açıklamayı şu şekilde de kullanabilirsiniz :

@Column(name = "created_on")
@ColumnDefault(value="CURRENT_TIMESTAMP")
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;

Hazırda Bekletme kullanılarak varsayılan Tarih / Saat sütun değeri

Hazırda Bekletme ile JPA kullanıyorsanız ve oluşturma zaman damgasını ayarlamak istiyorsanız, @ColumnDefaultek açıklamayı şu şekilde kullanabilirsiniz :

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

@CreationTimestampEk açıklamayı kullanma hakkında daha fazla ayrıntı için bu makaleye göz atın .


Mükemmel, @Generated kullanmak benim için çalıştı. Peki @GeneratedValue ile ne fark olur?
Braian Coronel

1
@GeneratedValueyalnızca varlık tanımlayıcıları için kullanılabilir.
Vlad Mihalcea

@GeneratedValueyalnızca varlığın birincil anahtarı ve @Generatedilkel değerler için çalışır. Ancak bir alt varlık veya benzeri ek açıklamaları olan yabancı anahtar için ne kullanmalıyım @OneToOne? Çünkü bu durum için 2 ek açıklamadan hiçbiri benim için işe yaramıyor.
Braian Coronel

Bu makalede@MapsId açıklandığı gibi kullanın .
Vlad Mihalcea

Sonunda bunu @DynamicInsertvarlıkta kullanarak
çözdüm

3

Herhangi bir tablo sütunundaki varsayılan değeri kullanmak için. o zaman @DynamicInsertdoğru olarak tanımlamanız gerekir, yoksa sadece tanımlarsınız @DynamicInsert. Çünkü hazırda bekletme varsayılan olarak doğru kabul edilir. Verilen örnek olarak düşünün:

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

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

}

2

Oracle ile çalışırken, Enum için varsayılan bir değer eklemeye çalışıyordum

Aşağıdakileri en iyi şekilde çalıştığını buldum.

@Column(nullable = false)
@Enumerated(EnumType.STRING)
private EnumType myProperty = EnumType.DEFAULT_VALUE;

2

Varsayılan değerleri ayarlamak için java sınıfı yapıcısını kullanabilirsiniz. Örneğin:

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
...

}


1

Hibernate 5 ve postgres ile çalışıyorum ve bu benim için çalıştı.

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

0

Veritabanı açısından varsayılan değeri ayarlamak isterseniz, @Column( columnDefinition = "int default 1")

Ancak, niyet ettiğiniz şey java uygulamanızda varsayılan bir değer ayarlamaksa, bunu sınıf özniteliğinizde şu şekilde ayarlayabilirsiniz: private Integer attribute = 1;


0

Bir alt varlık içeren bir varlığımız olduğunu varsayalım.

Kullanılması insertable = false, updatable = falseyeni alt varlıkları yaratan ve varsayılan DBMS değerini önceki gelen varlık bulunanları engeller varlık. Ancak bununla ilgili sorun, her zaman varsayılan değeri kullanmak zorunda olmamız veya varlığın varsayılan olmayan başka bir alt varlık içermesine ihtiyacımız varsa, bu ek açıklamaları çalışma zamanında olarak değiştirmeye çalışmalıyız insertable = true, updatable = true, böylece iyi bir yol gibi görünüyor.

Alt varlığın içinde, tüm sütunlarda kullanmak daha mantıklıysa, insertable = false, updatable = falseböylece kullandığımız yöntemden bağımsız olarak artık alt varlık oluşturulmaz ( @DynamicInsertbununla birlikte gerekli olmazdı)

Varsayılan bir değerin eklenmesi, yapıcı veya ayarlayıcı kullanılarak Varsayılan varlık özelliği değeri gibi çeşitli şekillerde yapılabilir . JPA'yı columnDefinition ile kullanmak gibi diğer yolların dezavantajı, varsayılan olarak bir boş değer eklemesidir ve DBMS'nin varsayılan değerinden önce gelmez.


DBMS'yi kullanarak varsayılan değeri ve Hazırda Beklet'i kullanarak isteğe bağlı değeri girin

Ancak kullanarak @DynamicInsert, varsayılan değerine sahip bir alt varlık eklemek istediğimizde db'ye bir boş değer göndermekten kaçınırız ve karşılığında varsayılan değerden farklı değerlere sahip alt varlıkların eklenmesine izin veririz.

Ekleme için, hazırlanan sql deyiminde yalnızca boş olmayan sütunlara atıfta bulunulduğunda bu varlık dinamik sql oluşturmayı mı kullanmalı?

Aşağıdaki ihtiyaçlar göz önüne alındığında:

  • İşletmenin yeni alt kuruluşlar yaratma sorumluluğu yoktur.
  • Bir varlık eklerken, alt varlık, DBMS'de varsayılan olarak tanımlanan olandır.
  • Varsayılan dışında bir UUID'ye sahip bir alt varlık ile bir varlık oluşturma olasılığı.

DBMS : PostgreSQL | Dil : Kotlin

@Entity
@Table(name = "entity")
@DynamicInsert
data class EntityTest(
        @Id @GeneratedValue @Column(name = "entity_uuid") val entityUUID: UUID? = null,

        @OneToOne(cascade = [CascadeType.ALL])
        @JoinColumn(name = "subentity_uuid", referencedColumnName = "subentity_uuid")
        var subentityTest: SubentityTest? = null
) {}

@Entity
@Table(name = "subentity")
data class SubentityTest(
        @Id @GeneratedValue @Column(name = "subentity_uuid", insertable = false, updatable = false) var subentityUUID: UUID? = null,
        @Column(insertable = false, updatable = false) var name: String,
) {
        constructor() : this(name = "")
}

Ve değer, veritabanında varsayılan olarak ayarlanır:

alter table entity alter column subentity_uuid set default 'd87ee95b-06f1-52ab-83ed-5d882ae400e6'::uuid;

GL


-3

Yukarıdaki öneri işe yarar, ancak yalnızca ek açıklama alıcı yönteminde kullanılıyorsa. Üyenin ilan edildiği yerde ek açıklamalar kullanılırsa hiçbir şey olmaz.

public String getStringValue(){
     return (this.stringValue == null) ? "Default" : stringValue;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.