Lütfen JPA @Column ek açıklamasına referans olarak inserttable = false ve updatable = false hakkında açıklayın


151

Bir alana açıklama eklenirse insertable=false, updatable=false, değer ekleyemeyeceğiniz veya mevcut değeri değiştiremeyeceğiniz anlamına gelmez mi? Bunu neden yapmak istiyorsun?

@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;
}

Yanıtlar:


121

Söz konusu ilgili varlığı yaratma / güncelleme sorumluluğu mevcut kurumda değilse bunu yaparsınız . Örneğin, bir Personve bir Address. Kuruluştaki varlık ile insertable=false, updatable=falseolan @OneToManyilişkiye, bir a oluşturmak veya güncellemek kuruluşun sorumluluğu olmadığı için eklemek istiyorsunuz . Tam tersi.PersonAddressAddressPerson


insertable=false,updatable=falseİlişkinin iki tarafında da tanımlamayı ifade eder .
BalusC

3
Güncellenebilir = false ile Kişi üzerinde adres güncellerken Person.name güncellenmesini devre dışı bırakacağını söylüyorsunuz (bu basamaklamanın amacı olduğu için katılmıyorum). Ayrıca u @Column tanımının yabancı anahtar (Kişi) ve yabancı anahtar olmadığında (güncellemeyi devre dışı bırakmak için referans verilen bir varlık olmadığı için) farklı bir şey yaptığını söylüyorsunuz. Güncellenebilir için javadoc okuyarak, sadece bir kez devam ederse verilen Adres için Kişiyi değiştirmeyi devre dışı bırakacağını söyleyebilirim. Açıklayabilir misiniz lütfen?
Flowy

8
Sanırım demek ... to the @ManyToOne relationship with the ...istedin ??
Martin Konecny

111

Tanımlama insertable=false, updatable=false, bir varlıkta bir alanı birden çok kez eşlemeniz gerektiğinde yararlıdır, genellikle:

Bu IMO anlamsal bir şey değil, kesinlikle teknik bir şeydir.


15
Bu cevabın kabul edilenden çok daha iyi olduğuna inanıyorum. Kabul edilen cevap, eklenebilir / güncellenebilir özniteliğin ilgili varlığın oluşturulması / güncellenmesi ile ilgili olduğunu hissettirirken, bu özniteliklerin arkasındaki gerçek niyet, mevcut varlığa sütunun eklenmesini / güncellenmesini önlemektir. İlgili varlığın oluşturulması / güncellenmesi, eşleme ek açıklamasının basamaklı niteliğiyle ele alınır.
Jayant

25

BalusC ve Pascal Thivent'in diğer yaygın kullanımlarının cevaplarına eklemek istiyorum insertable=false, updatable=false:

Kimlik olmayan ancak bir tür sıra numarası olan bir sütun düşünün . Sıra numarasını hesaplama sorumluluğu mutlaka uygulamaya ait olmayabilir.

Örneğin, sıra numarası 1000 ile başlar ve her yeni varlık için bir artar. Bu, veritabanında kolayca yapılır ve çok uygun şekilde yapılır ve bu gibi durumlarda bu yapılandırmalar mantıklıdır.


1
sekanslar da JPA tarafından desteklenir, böylece sekansınızı JPA ek açıklamalarıyla da tanımlayabilirsiniz.
eis

8

Başka bir örnek, veritabanının tarih oluşturma işlemini işlemesine izin vermek istediğiniz "created_on" sütunundadır


Hazırda Bekletme'nin güncelleştirilebilir = yanlış ek açıklamaya dayalı güncellemeleri engellemesi mi gerekiyor? JPA veri havuzumda bu ek açıklama içeren bir create_on sütunu güncellemeleri şikayet etmeden kabul eder.
chrisinmtown

1
@chrisinmtown Eclipselink sql sütun hiç eklemez. Hibernate
Jaqen H'ghar
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.