[Beginner] Hibernate: Wie muss ich mappen?

saftmeister

Nutze den Saft!
Hallo,

ich arbeite mich gerade in Hibernate ein und habe auch vor, damit eine Applikation zu bauen, die wir in der Firma einsetzen. Die Applikation soll eine bisherige mit schlechter Code-Basis ablösen.

Ich habe ein Verständnisproblem mit dem Mapping von n:1-Beziehungen. Verwendet werden Annotations, ein XML will ich nicht auch noch pflegen - das geht bequemer im Code.

Ok, konkreter Fall. Erstmal das Datenmodell.

Code:
Tabelle "Condition"
- ID PK (int)
- ConditionTypeID (int) Fremdschlüssel auf ConditionType.ID
- ParameterName (string)
- ParameterValue (string)

Tabelle "ConditionType"
- ID PK (int)
- Name (string)
- DisplayName (string)

Da es sich um eine n:1 Beziehung handelt, also viele Konditionen können einen Konditionstyp haben, es gibt aber mehrere Konditionstypen und auch mehrere Konditionen, wollte ich die OneToMany-Annotation verwenden. Aber wie genau müssen die aussehen und warum? Ich habe das Gefühl, dass ich das falsch mache. Bisher habe ich jeweils ein PO für die Tabellen erzeugt und die Assoziation so gepflegt:

Klasse Condition
Java:
    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL,
            targetEntity = ConditionType.class)
    private ConditionType type;

Klasse ConditionType
Java:
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "type")
    @PrimaryKeyJoinColumn
    private Condition condition;

Leider bekomme ich hier die Exception

Code:
org.hibernate.AnnotationException: Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements: po.Condition.type

Wenn ich es richtig verstehe, meckert Hibernate rum, das Condition.type keine Collection ist.

Ist mein Ansatz überhaupt richtig und wenn nein, wie müsste es korrekt lauten? Könnte es sein, das ich doch OneToOne verwenden muss?

Ich möchte keine komplette Erklärung, aber ein Schubs in die richtige Richtung würde mir sehr weiter helfen.

Danke und Grüße
 
Zuletzt bearbeitet:

saftmeister

Nutze den Saft!
Ok, das ist total albern, weil ich viel zu kompliziert gedach und es eigentlich doch recht einfach ist. Memo an mich selbst und nur falls jemand über das gleiche Problem stolpern sollte:

ConditionType ist nicht von Condition abhängig. Eine Abhängigkeit besteht nur von Condition zu ConditionType. Daher braucht in ConditionType auch keine Beziehung definiert werden. In Condition jedoch muss OneToOne annotiert und anschließend die Spalte festgelegt werden, in der der Verbindundgsschlüssel (Fremdschlüssel) von ConditionType.ID zu Condition.ConditionTypeID festgelegt wird.

Das heißt wir brauch nur in in Condition folgendermaßen annotieren:

Java:
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "ConditionTypeID")
    private ConditionType type;