2016-04-08 24 views
0

Aynı sınıfı temsil eden 2 hemen hemen aynı tablo var. Tek fark, 2. tablonun, 1 sütunun aksine 2 sütunlu bir birincil anahtara sahip olmasıdır. kimliği ve sürüm kimliği ve sürüm İlk tablo, nesnelerin geçerli durumunu gösterirken, 2. tablo tetikleyicilerle sürdürülen tam geçmişi içerir (belki de tetikleyicilerin iyi olduğunu düşündüğüm tek zaman). Spring Boot w/Spring Data JPA kullanıyorum ve ORM olarak hazırda bekletiyorum. Bir nesnenin tam bir geçmişi için tarih tablosunu id ve version ve id tarafından sorgulayarak sorgulamak istiyorum. Ben findHistory Hazırda çağırdığınızdaFarklı PK'larla 2 farklı tabloyu aynı sınıfa nasıl eşlersiniz?

@Entity 
@Table(name = "page") 
public Class Page { 
    @Id 
    @Column(name = "id") 
    private Integer id; 
    @Column(name = "version") 
    private Integer version; 
    //... 
} 

public interface PageRepository extends JpaRepository<Page, Integer> { 
    // Some current page specific methods... 

    @Query(value = "select * from page_history where id = :pageId order by version asc", nativeQuery = true) 
    List<Page> findHistory(@Param("pageId") Integer pageId); 

    //... 
} 

Ne yazık ki, aynı kimliğe sahip ResultSet içinde birden fazla kayıt oluşturduğu bu yüzden birincil anahtar olarak id sütununu tanır: Ben böyle bir şey yapabileceğini (boşuna) umuyordum 1. düzey Oturum önbelleğini kullanır ve aynı nesneyi defalarca döndürür.

Farklı eşlemelerle 2 özdeş sınıf oluşturmadan ideal olarak istediğimi yapmanın bir yolu var mı?

cevap

1

"Neredeyse aynı tablolar"! = "Aynı tablolar". Veritabanınızı normalize etmeniz gerekiyorsa, Kalıtım'ı kullanarak bir temel sınıf oluşturabilir ve farklılıkları barındıran Varlıklar ile genişletebilirsiniz. Ancak, veritabanı sorunlarını telafi etmek için JPA'yı manipüle etmeye çalışmanın iyi bir fikir olduğunu düşünmüyorum. Veritabanını düzeltmek ya da sadece iki ayrı öğe yapmak daha iyidir.

+0

Java nesneleri aynıdır, yani miras kullanmak bir hacktir. Kısıtlar farklıdır çünkü 1. tablo bir kaydın sadece 1 (geçerli) versiyonunu içerirken, 2. bir kaydın tüm geçmişini içerir. Bu nedenle, tablo 1'deki PK sadece ID'dir ve Tablo 2'deki PK, ID ve Versiyon'dur (versiyon her iki tabloda da mevcuttur). Bunu bir DB tasarım sorunu olarak görmüyorum, ancak JPA'da desteklenmeyen bir şey. Alt seviyeye gitmem ve sql yazmam ve sonuç kümesinden kendim okumam gerekebilir. – hookumsnivy

İlgili konular