JPA

2015-07-08 23 views
6
  • ben
JPA üzerinden erişebilecek istiyorum
  • (Aksi kompozit veya) belirgin birincil anahtara sahip bir SQL veritabanında görüşlere sahip kullanırken birincil anahtarı olmadan veritabanı harita görünümüne nasıl

    JPA'daki tabloları ele aldığım gibi (@Table ek açıklama vb. Kullanarak) görebildiğimi okudum. Ancak, birincil anahtar olmadan, EVERY COLUMN'dan (aslında, Hibernate'in tersine mühendislik aracının varsayılan olarak yaptığı gibi) bir bileşik anahtarı etkili bir şekilde yapmak zorundayım. Bununla birlikte, bunu yaparsam istenmeyen yan etkiler de vardır. E.g.JPA

    • birincil anahtarın nitelikler yerine görünümleri yönlendiren tüm size kod yazmak zorunda.

      myViewObject.getPrimaryKey() getFirstName()

    • "findBy kullanmak edememek ... "Bahar Deposu'ndaki yöntemler (bu özellik görünümün" tanımlayıcısının "bir parçası olduğundan ve aslında özniteliklerinden biri değil).

    Sorum edilir: nasıl kolayca JPA kullanarak kendi özelliklerini erişebilir gibi bir oldu böyle de harita görünümlerinde mı?

    Not: Tamamen yanlış yaklaşım kullandığımı söylemekten oldukça memnunum. Bu böyle ortak bir sorun gibi görünüyor daha iyi bir çözüm olmak zorunda.

  • +0

    Kullandığım bir numara, birden çok kayıt döndürme potansiyelinin kaçının olduğunu görmek ve tüm bu durumlarda tüm kayıtlar için benzersiz kalacak bir alan olup olmadığını görmek için görünümde olası sorguları analiz etmektir. Böyle bir senaryo bulabilirseniz, ORM sadece tek bir sorgunun sonuçları arasındaki tekliği önemsemediği için birincil anahtar olmasa bile bu alanı birincil anahtar olarak atayabilirsiniz. Ancak, ikinci seviye önbelleği kullanamayacağınızı unutmayın. Bu hile geçerli olmayan durumlarda, birincil anahtar içerecek şekilde görünüm için sorguyu değiştiririm. – manish

    +0

    "getFirstName()" gibi temsilci yöntemleri yazarken, bunu this.getPrimaryKey(). GetFirstName() 'döndüren bir şey yok. Öyleyse sadece uzun versiyonu bir kez yazman gerekiyor. Yanlış bir yaklaşım olarak, bizim uygulamasında 400'den fazla Varlıklar/Tablolar var ve tek bir View-Varlığı yok. Bir kez kullanmayı denedim çünkü yardım edeceğini düşündüm, ancak sorunlara neden oldu, bu yüzden aynı işi yapan JPQL'de aynı 'görünümü' oluşturdum ve bana daha fazla esneklik sağladım. – DuncanKinnear

    cevap

    5

    Görünümlerin her sırasına bir UUID sütun ekleyebilirsiniz, böylece use the UUID column as an @Id yapabilirsiniz.

    +0

    Evet, işe yaradı, teşekkürler. Fazladan bir sütun içerecek şekilde benim (Oracle) görüşlerini deđiţtirdiđiniz: 'uuid' Sonra görünümü @Entity üstüne aşağıdaki özelliği eklendi AS) (SYS_GUID: ' @id @column (name =" UUID ") @JsonIgnore Korumalı String uuidHex; –

    +2

    Andy, çözümün hatalı olduğunu varsayalım. UUID her sorguda farklı olacaktır. Temel olarak geçerli bir kimliktir, ancak belirli bir UUID tarafından bir kez daha A, A'yı seçebilmeyi beklemem. Bir varlık listesinden tek bir varlığa gidemezsiniz. Dolayısıyla, bu UUID temel tablolardan birinin parçası olmalı ve aslında bir sütun olarak saklanmalı ve görünümde hesaplanmamalıdır. Bir alternatif maddelenmiş görünümler kullanıyor olabilir. –

    +0

    Aksine, sorunu çözmek için tam olarak ihtiyacım olan şey bu. Sorunum, belirgin bir birincil anahtar olmadı (yukarı bakın). Bazıları veya tümü boş olabilecek (SQL veritabanlarında yeterince tipik) saf veri sütunlarının bir koleksiyonunu düşünün. Hibernate mutlu tutmak için onlara yapay bir PK vermeliydim. Oluşturulan UUID'yi sorguya eklemek, bu kriterleri karşıladı. Navigasyon ilk etapta asla bir seçenek değildi. –