Guice + Hibernate = Probleme?

Jay_030

Aktives Mitglied
Es ist mal wieder soweit: Eine Guice Frage. 😳

Folgender Ausgangspunkt: Ich habe mein Domänenmodell zuerst mit Interfaces modelliert, danach die jeweilige Implementierung dafür gemacht. Das ganze ist für Guice über ein DomainModule zugänglich. Jetzt wollte ich Hibernate-Annotations in die Implementierungen klatschen, um die Objekte persistieren zu können. Und dabei, der geübte Guice-Nutzer ahnt es, quoll mein Log mit Fehlermeldungen über. 😉

Da ich in den Implementierungen natürlich auch immer das Interface eines referenzierten Typs angegeben habe, kann Hibernate das natürlich nicht auf die gebundene Klasse aus Guice mappen.

Ich habe z.B. ein Interface SpielerEigenschaft, die als Attribut einen Spieler (auch ein Interface) und ein paar andere Sachen hat. Die Interfaces bindet Guice über das DomainModule an die richtigen Klassen und injected auch alles richtig. Aber z.B. die Persistence Annotation @OneToMany erwartet ja bei mappedBy und targetEntity eine konkrete Klasse bzw. ein Feld. Jetzt könnte ich in die Implementierungen der Domain-Interfaces natürlich durchaus die konkreten Klassen reinschreiben. Aber da fehlt mir irgendwie das DI Prinzip und ich verliere die lose Kopplung.

Helft mir mal bitte auf die Sprünge. 🙂

Ich könnte ja die AOP Features von Guice nutzen und vielleicht die Typen und Annotations für Hibernate beim Starten manipulieren, aber das wirkt wie mit Kanonen auf Spatzen. ^^
 
Zuletzt bearbeitet:
Wieso gibst du in deinen Hibernate-DAOs nicht einfach die Interfaces zurück?

Das ist eine Stelle wo DI wenig sinn macht und auch kaum Funktionieren wird, denn Hibernate muss die Entities mit new bzw Reflection erzeugen. Es weiß nix von deinem Guice Container, von daher kannst du da Konfigurieren was du willst.

Noch was: wenn idhc dich richtig verstanden habe, hast du die Hibernate Annotationen an die Interfaces geschrieben?

Das ist totaler unfug

Ein kleines Beispiel:

Interface Person

Klasse PersonEntity (mit Hibernate/JPA Annotations)


Interface PersonDao

Methode findAll() : Person

Und Klasse HibernateDao implementiert das Interface PersonDao,
nutzt intern das Entity und returned es (in form des interfaces)
 
Zuletzt bearbeitet von einem Moderator:
Wieso gibst du in deinen Hibernate-DAOs nicht einfach die Interfaces zurück?
Um die DAOs geht's nicht. 🙂

Noch was: wenn idhc dich richtig verstanden habe, hast du die Hibernate Annotationen an die Interfaces geschrieben?

Das ist totaler unfug
Habe ich auch nicht gemacht.

Ich unterfütter mein Problem mal mit etwas Code.
Java:
public interface SpielerEigenschaft {

    Spieler getSpieler();
    void setSpieler(Spieler spieler);

    ...
}

public interface Spieler {

    Set<SpielerEigenschaft> getEigenschaften();
    void setEigenschaften(Set<SpielerEigenschaft> eigenschaften);

    ...
}

Das sind Interfaces für das Domänenmodell. Beim Spieler implementiere ich das Set, welches mit SpielerEigenschaft typisiert ist, natürlich nicht mit der konkreten Klasse DefaultSpielerEigenschaft sondern mit SpielerEigenschaft:

Java:
public class DefaultSpieler implements Spieler {

    private Set<SpielerEigenschaft> eigenschaften = new HashSet<SpielerEigenschaft>();

    ...
}

So, jetzt zu Hibernate. Wenn ich das eigenschaften-Set mit OneToMany und mappedBy="spieler" mappen möchte, geht das natürlich nicht, da mappedBy ein konkretes Feld erwartet. Dies könnte ich erreichen, indem ich DefaultSpielerEigenschaft.class als targetEntity angebe. Jedoch füge ich dadurch Abhängigkeiten ein, die dafür sorgen, dass ich gleich hätte
Java:
private Set<DefaultSpielerEigenschaft> eigenschaften = new HashSet<DefaultSpielerEigenschaft>();
formulieren können.
 

Zurück
Oben