JPA Hibernate und Table_Per_class Erbe

stimmen
0

Ich habe eine Entität, die Super-Klasse ist

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

}

und einige Unterklassen, die die übergeordnete Klasse erweitern.

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


}

Die anderen Klassen gleich aussehen.

Früher habe ich sie für die Vererbung Typ SINGLE_TABLE haben, aber wir wollten jede konkrete Klasse jede eigene Tabelle haben. Wegen TABLE_PER_CLASS hatte ich GenerationType.TABLE zu verwenden.

Ich habe auch eine Entity-Klasse, die einen Fremdschlüssel für die Superklasse

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

Ich habe eine abstrakte Klasse, weil ich eine Entity1 Klasse, die andere Art von Superklasse haben könnte. Wir wollten nicht anders Entity1 und Entity2 und Entity3 etc Klassen für jede Unterklasse erstellen. So haben wir eine Entity1 Klasse, die ein Feld vom Typ Oberklasse haben kann, die auf eine der Unterklassen zeigen könnten.

Auf meinem Programm erstelle ich viele Entity1 intances, dass einige von ihnen, die andere Art von Super als Feldwert haben. Jeder konnte vom Typ subclass1 oder subclass2 sein usw. Zuerst haben wir eine einzige Tabelle für alle Unterklassen haben. Alles hat gut funktioniert. Aber nachdem wir beschlossen, unsere Tabellen aufzuspalten das ist, was es passiert. Wenn ich jede Entity1 Instanz bearbeiten, hat das schon Oberklasse Feldsatz (eine der Unterklassen verwenden), und speichern Sie es (verschmelzenden es), dann erzeugt es eine neue Instanz meiner Subclass im Zusammenhang mit meiner Entity1 Instanz, und dann speichert sie in dem Datenbank. So habe ich zwei Aufzeichnungen jetzt auf dem Tisch der Unterklasse. Dies ist nicht geschehen, wenn wir einen SINGLE_TABLE Vererbungstyp. Ist das ein normales Verhalten für JPA und Hibernate?

Veröffentlicht am 03/08/2015 um 15:29
vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
0

Bitte beachten Sie, zuerst das: DiscriminatorColumn und DiscriminatorValue Anmerkungen sind spezifisch für Single-Table-Ansatz. So sind sie nicht in Tabelle pro Klasse Zuordnungen verwendet werden.

Lassen Sie uns nun auf die Frage gehen:

In Tabelle pro Klasse Mapping, wird es zwei Datensätze mit derselben ID sein: ein in einer übergeordneten Tabelle, andere in einer untergeordneten Tabelle.

Wie ich verstanden, in Ihrem Fall, zwei Datensätze in der untergeordneten Tabelle werden, richtig geschrieben? Wenn dies der Fall sein, muss das Problem, wenn Sie die Entity1 Daten aus der Datenbank laden. Die Eigenschaft „Superklasse“ muss die ID gesetzt haben. Sie können für diese eifrigen oder verzögertes Laden verwenden. Und prüfen, ob diese Eigenschaft richtig (im Debug-Modus) mit seinem korrekten ID Satz geladen wird es vor dem Speichern.

Ein anderer Weg ist „Kaskade bestehen / merge“ zu deaktivieren und die Einheiten separat zu speichern. Es kann mehr Sicherheit für Ihre Daten.

Sie können mehr Informationen finden Sie hier: http://docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html

Beantwortet am 03/08/2015 um 16:01
quelle vom benutzer

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