JPA hibernacji i Table_Per_class dziedziczenie

głosy
0

Mam podmiot, który jest super klasa

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

}

a niektóre podklasy, które rozciągają nadklasy.

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


}

Pozostałe zajęcia wyglądają tak samo.

Kiedyś je SINGLE_TABLE na typ dziedziczenia, ale chcieliśmy każdej klasy betonu mieć każdy swój stolik. Ze względu TABLE_PER_CLASS musiałem użyć GenerationType.TABLE.

Mam także klasę podmiot, który klucz obcy do super klasy

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

Kiedyś klasy abstrakcyjnej, ponieważ mam jedną klasę Entity1 które mogą mieć różny typ nadklasy. Nie chcieliśmy, aby utworzyć inny Entity1 i Entity2 i Entity3 itp klas dla każdej podklasy. Dlatego stworzyliśmy jedną klasę Entity1 które mogą mieć pole typu nadklasy, które mogłyby wskazywać na dowolny z podklasy.

Na moim programie tworzę wiele intances Entity1 że niektóre z nich, które mają inny rodzaj nadrzędnej jako wartość pola. Każdy może być typu subclass1 lub subclass2 itp Początkowo używaliśmy mieć pojedynczą tabelę dla wszystkich podklas. Wszystko działało w porządku. Ale po zdecydowaliśmy się podzielić nasze stoły to jest to, co się dzieje. Kiedy edytować dowolną instancję Entity1, że ma już SuperClass zestaw pola (przy użyciu jednej z klas sub) i zapisać go (łączących go), a następnie tworzy nową instancję moim Podklasa powiązanych z moim przykład Entity1, a następnie zapisuje je do Baza danych. Mam więc dwa rekordy teraz na stole podklasy. Tak się nie stało, kiedy użyliśmy SINGLE_TABLE rodzaj dziedziczenia. Czy to normalne zachowanie dla JPA i hibernacji?

Utwórz 03/08/2015 o 15:29
użytkownik
W innych językach...                            


1 odpowiedzi

głosy
0

Proszę najpierw rozważyć to: DiscriminatorColumn i DiscriminatorValue adnotacje są specyficzne podejście do pojedynczej tabeli. Więc nie są one do stosowania w odwzorowań table-per-klasie.

Teraz przejdźmy do kwestii:

W tabeli mapowania-per-klasy, nie będzie dwie płyty o takim samym ID: jeden w tabeli nadrzędnej, inne w tabeli podrzędnej.

Jak zrozumiałem, w danym przypadku, dwa rekordy są zapisywane w tabeli podrzędnej, prawda? Jeśli tak, to problem musi być podczas ładowania danych Entity1 z bazy danych. Właściwość „nadrzędna” musi mieć swój zestaw ID. Można użyć chętny lub leniwy załadunku do tego. I sprawdzić, czy że nieruchomość jest prawidłowo załadowany (w trybie debugowania) z prawidłowym zestawem ID przed zapisaniem.

Innym sposobem jest wyłączenie „kaskada utrzymują / scalania” i zapisać podmiotów oddzielnie. może zapewnić większe bezpieczeństwo dla Twoich danych.

Możesz znaleźć więcej informacji tutaj: http://docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html

Odpowiedział 03/08/2015 o 16:01
źródło użytkownik

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