2009-05-07 10 views
9

Değiştirilemeyen eski bir şema var. Ortak özellikler için bir temel sınıf kullanıyorum ve gömülü bir nesne içeriyor. Yerleştirilmiş nesnede normalde yalnızca bir (alt) alt sınıf için kalıcılık kimliğinde olması gereken bir alan vardır. Bunu içeren yeni bir id sınıfı yaptım ama sonra alanın iki kez eşleştirildiğini anladım. İşte çok okuyucunun aklı korumak için basitleştirilmiş bazı örnek kod: Ben @AttributeOverride denediJPA'da bir üst sınıf geçişinden miras alınmış bir alan nasıl oluşturulur?

@MappedSuperclass 
class BaseClass { 
    @Embedded 
    private Data data; 
} 

@Entity 
class SubClass extends BaseClass { 
    @EmbeddedId 
    private SubClassId id; 
} 

@Embeddable 
class Data { 
    private int location; 

    private String name; 
} 

@Embeddable 
class SubClassId { 
    private int thingy; 

    private int location; 
} 

ama sadece o alanı yeniden adlandırmak için alabilirsiniz. Bunu updatable = false, insertable = false olarak ayarlamaya çalıştım ama bu, @AttributeOverride ek açıklamasında kullanıldığında işe yaramadı. Bu sorunun çözümü için aşağıdaki cevaba bakın.

Temel sınıfı değiştirebileceğimin farkındayım ancak paylaşılan kodu, çevreleyen kod daha karmaşık hale getirecek ve bazı çirkin sarma kodları gerektireceğinden ayırmak için gömülü nesneyi bölmek istemiyorum. Bu köşe davası için tüm sistemi yeniden tasarlayabilirim ama gerçekten istemem.

JPA sağlayıcım olarak Hazırda Beklet özelliğini kullanıyorum.

cevap

5

AttributeOverride çalışma nedeni bulamadım. Sınıfı eklerken, gömülü nesnenin tanımlayıcısını ad alanına eklemelisiniz. Bu yapıyordu:

@Entity 
@AttributeOverride(name = "location", column = @Column(name = "location", insertable = false, updatable = false) 
class SubClass extends BaseClass { 

bu olması Gerektiğinde:

@Entity 
@AttributeOverride(name = "data.location", column = @Column(name = "location", insertable = false, updatable = false) 
class SubClass extends BaseClass { 

Garip şey @ Kol'un adı alanını değiştirerek yaptığını ilk sürümü ama sokulabilen ve güncellenebilir alanları ile çalışma göz ardı edildi edilir . Bu JPA spec bir hata veya bir incelik olup olmadığını bilmiyorum.

Her neyse, bu alanın salt okunur hale getirilmesini nasıl çözdüğünü çözüyor ancak orijinal soruyu yanıtlamıyor: Eşlenmiş bir süper sınıf geçişinden bir alan oluşturmak mümkün mü?

+0

Buranın 6 yaşında olduğunu biliyorum, ama bu soruya bir çözüm buldunuz mu? Ve/veya ne olduğunu hatırlıyor musun? –

+0

@EricB. Maalesef, eşlenmiş bir alanı miras almanın bir yolunu bulamadınız. Bunu yapmanın mümkün olduğunu düşünmüyorum. Java'da kalıtsal bir yöntemin görünürlüğünü azaltmaya çalışmak gibi görebiliyorlar - bu yüzden sadece kurallara aykırı. Benim durumumda biraz çirkin olan ama tek seçenek olan köşe davasında çalıştım. –

İlgili konular