JPA hazırda ve Table_Per_class kalıtım

oy
0

Süper sınıftır bir varlık var

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Table(name = super_class)
public abstract class SuperClass implements Serializable {
    @Transient
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private long id;

    public abstract void initDefaultValues();

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

}

ve üst sınıf uzatmak bazı alt sınıfları.

@Entity
@Table(name = Subclass1)
public class Subclass1 extends SuperClass{

    private static final Logger log = LogManager
            .getLogger(Subclass1.class);
    @Transient
    private static final long serialVersionUID = 1L;

    // testcase configuration tab
    private String configurationTabTestServer;


    private String umtsRelease;


}

diğer sınıflar aynı görünüyor.

Ben miras türü için onları SINGLE_TABLE için kullanılan ama biz her kendi tablo için her beton sınıfı istedi. TABLE_PER_CLASS yüzünden ben GenerationType.TABLE kullanmak zorunda kaldı.

Ayrıca süper sınıfa yabancı bir anahtar vardır bir varlık sınıfı vardır

@Entity
@Table(name=myother_entity)
class Entity1{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @OneToOne(cascade = CascadeType.ALL)
    private SuperClass superclass;
    //more fields
}

Ben üst sınıf farklı türü var edebilecek tek ENTITY1 sınıf var çünkü soyut bir sınıf kullandı. Her alt sınıf için farklı ENTITY1 ve ENTITY2 ve ENTITY3 vb sınıfları oluşturmak istemedim. Bu yüzden alt sınıflarından birine işaret olabilir tip üst sınıf bir alanını olabilir biri ENTITY1 sınıfını yarattı.

Benim programında Bazılarının alan değeri olarak üst sınıfın farklı türde olan birçok ENTITY1 intances oluşturun. Hepimizin alt sınıfları için tek bir tablo için kullanılan her İlk başta tip subclass1 veya subclass2 vb olabilir. Her şey iyi çalıştı. Bizim tabloları dağılma kararı sonrasında Ama bu o ne olduğudur. Ben herhangi bir ENTITY1 örneğini düzenlerken, zaten SuperClass alan kümesi (alt sınıflardan biri kullanılarak) vardır ve o zaman benim ENTITY1 örneğiyle ilişkili benim alt sınıfının yeni bir örneğini oluşturur ve daha sonra kaydeder (bunu birleştirme) kaydedin veri tabanı. Yani alt sınıfının masaya şimdi iki kayıtları var. Biz SINGLE_TABLE devralma türü kullanıldığında Bu olmadı. JPA ve hazırda bekletme için bu normal bir davranış mı?

Oluştur 03/08/2015 saat 15:29
kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
0

, Öncelikle bu dikkate alınız: DiscriminatorColumn ve DiscriminatorValue ek açıklamalar tek tablo yaklaşımına özgüdür. Böylece masa başı sınıfta eşleştirmeleri kullanılmak üzere değildir.

Şimdi, konuya dönelim:

Bir üst tablosunda bir, bir çocuğun tablodaki diğer: Tablo başına sınıfında haritalama olarak, aynı kimlikle iki kayıtlar olacaktır.

Anladığım kadarıyla senin olayda, iki kayıtlar doğru, alt tabloda yazılı ediliyor? Eğer öyleyse sen veritabanından ENTITY1 veri yüklemek zaman sorun olmalı. mülkiyet "üst sınıf" kendi kimliği ayarlanmış olmalıdır. Bunun için istekli ya da tembel yükleme kullanabilirsiniz. Bu özellik düzgün kaydetmeden önce onun doğru kimliği ayarlanmamış (hata ayıklama modunda) yüklenir eğer kontrol edin.

Bir başka yolu devre dışı "çağlayan inat / birleştirme" ve ayrı ayrı varlıkları kurtarmak için etmektir. Bu verilerinize daha güvenlik sağlayabilir.

Daha fazla bilgiyi burada bulabilirsiniz: http://docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html

Cevap 03/08/2015 saat 16:01
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more