2 Stimmen

Wie kann man mit Ormlite den gesamten Datensatz in Many-to-Many-Beziehungen abrufen?

Ich habe gerade angefangen, OrmLite zu benutzen und spiele damit herum. Ich habe Schwierigkeiten, einige Konzepte zu verstehen, insbesondere den Umgang mit vielen zu vielen Beziehungen.

Dies sind meine wichtigsten Tabellen:

Pc
    Name
    Domain
Ethernet
    IP
    Gateway
    Subnet
    MAC

Und hier die, die wie im Online-Beispiel eine Beziehung von vielen zu vielen gewährleisten:

PcEth

Ich befülle die Datenbank über:

    PC somePc = new PC("randomPc", "someDomain");
    pcDao.create(somePc);

    Ethernet eth1 = new Ethernet("127.255.0.1", "255.0.0.0", "192.168.1.1", "macadress");
    Ethernet eth2 = new Ethernet("192.168.1.1", "255.0.0.0", "192.168.1.1", "macadress");
    ethernetDao.create(eth1);
    ethernetDao.create(eth2);

    pcEthernetDao.create(new PcEthernet(somePc, eth1));

Aber ich bin mir ziemlich unsicher, wie ich alle Daten, die zu einem Pc gehören, zurückbekomme. Ich habe irgendwie erwartet, dass die

    PC pc = pcDao.queryForId(1);

um automatisch die Daten der anderen Tabellen abzurufen. Ist es nicht das, was ein ORM tun sollte? Ein Objekt zu haben, damit ich mich nicht um die zugrunde liegende Datenbank kümmern muss? Aber alles, was ich habe, ist in der Tat nur das Pc.object, das nur die PC-definierten Attribute hat. (Andererseits ist es nicht その überraschend, da ich nur auf dem pcDao handle).

Doch wie soll ich eine Abfrage so aufbauen, dass ich ein "Metaobjekt" erhalte, das alle zu einem PC gehörenden Daten enthält? Ein Objekt, das die Daten des PCs und eine Liste der zu den PCs gehörenden Ethernet-Geräte (die auch ihre eigene Liste von DNS-Adressen enthalten) sowie eine Liste von Software und Betriebssystemen enthält.

Soll ich nun die Abhängigkeiten manuell lösen? Einen PC abfragen, die PcEthernet-Tabelle nach übereinstimmenden Ids fragen, das EthernetDevice abrufen und so weiter?

Oder gibt es einen Trick, den ich noch nicht ganz verstanden habe?

3voto

Emmanuel Sys Punkte 807

Sie können sich die Many-to-many-Beispiel im Ormlite-Repository.

In ihrem Beispiel haben sie Tabellen User , Post y UserPost . Sie verwenden also ein Objekt, um die Join-Tabelle darzustellen UserPost und fragen Sie die Beziehung damit ab. Keine Magie.

Vielleicht können Sie das automatische Ausfüllen von Fremdobjekten mit der @ForeignCollectionField-Annotation auf beiden Seiten Ihrer m2m-Beziehung erreichen.

3voto

Gray Punkte 111812

Die Antwort von @Emmanuel ist gut, aber ich dachte, ich füge noch etwas Kontext hinzu. Er hat recht, dass Sie zumindest einen Teil dieser Beziehung selbst verwalten müssen.

Ist es nicht genau das, was ein ORM tun soll?

Ja, obwohl ORMLite ständig den Kampf "Größe gegen Funktionsumfang" führt. Es wurde entwickelt und gebaut, um ein "Lite"-ORM zu sein, und zu diesem Zweck wird es niemals eine vollständige Ergänzung der ORM-Funktionen wie Hibernate oder iBatis zu unterstützen.

Was Sie mit ORMLite und Ihrem Datensatz tun können, ist, wie @Emmanuel erwähnte, eine @ForeignCollectionField sowohl in Ihrem Pc y Ethernet Objekte.

public class Pc {
    @DatabaseField(generatedId = true)
    private long id;
    @ForeignCollectionField
    private ForeignCollection<PcEthernet> pcEthernets;
    ...
}

Wenn Sie eine Pc wird in einer separaten Abfrage die pcEthernets . Aber Sie müssen dann die Abfragen durchführen, um die zugehörigen Ethernet Objekte selbst.

Es gab schon früher Anfragen, die Join-Tabellen automatisch zu erstellen und die IN-Abfrage automatisch durchzuführen. Wenn Sie skizzieren möchten, wie das funktionieren würde, oder bei der Entwicklung helfen möchten, schließen Sie sich bitte dem ORMLite-Entwickler-Mailingliste .

Und schließlich: Brauchen Sie in diesem Fall wirklich eine Many-to-many-Beziehung? Ist nicht die Ethernet Objekt haben nur eine Pc Objekt?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X