Java Mapping ObservableList in Hibernate

e_Lap

Commander
Registriert
Apr. 2013
Beiträge
2.164
Moin,

ich schreibe im Moment ein kleines "Pizzabestellprogramm" zur Übung. Ich würde gerne die einzelnen Bestellitems in einer Mysql DB speichern. Mein Hibernatesetup klappt auch soweit, nur springt er beim mappen der ObservableListe (wird für die Darstellung innerhalb der JavaFX Gui verwendet) raus.

Meine Classenköpfe sehen aus wie folgt:

OrderItem (soll per Hibernate in der DB gespeichert werden):
Code:
public class OrderItem {

    private int id = 1;
    private StringProperty name;
    private FloatProperty price;
    //Jedes Orderitem enthaelt die Artikel in einer Liste
    private ObservableList<Article> orderContentList = FXCollections.<Article>observableArrayList();

    public OrderItem() {
    }

und mein OrderItem.hbm.xml:

Code:
<hibernate-mapping package="pizza">

    <class name="pizza.OrderItem" table="OrderItem">
        <id name="id" column="ORDERITEM_ID">
            <generator class="native"/>
        </id>
        <property name="name" />
        <property name="price"/>
        <property name="orderContentList"/>  //Hier springt er raus
    </class>

</hibernate-mapping>

Weiß jemand von euch, welchen typ ich für Hibernate vielleicht angeben muss oder wie ich das gemappt kriege?

Im Netz finde ich leider dazu nichts.

Danke im Vorraus!

€: meine Einzige Idee wäre, das Objekt OrderItem zu klonen (analog zu OrderItem noch ne Klasse erstellen) und die ObservableList in ne normale ArrayList umzuwandeln. Aber das wäre nicht wirklich ideal.

€2: mein Getter sieht wie folgt aus:
Code:
public ObservableList<Article> getOrderContentList() {
        return orderContentList;
    }

IntelliJ beschwert sich, dass das Property Attribut kein Container sein sollte. Aber wie soll ich den Getter denn dann aufbauen?...
 
Zuletzt bearbeitet:
Ganz so einfach geht das natürlich nicht. Doch zu Beginn möchte ich dir Hibernate Annotations ans Herz legen. Für mich persönlich erleichtern die Annotations die Arbeit mit Hibernate um ein Vielfaches. Du musst keine hbm.xml Datein mehr von Hand schreiben kannst direkt in Java-Klassen alle relvanten Mappings und Properties erkennen. Aber das nur am Rande.

Du kannst eine Liste/Container nicht als Property in der hbm.xml deklarieren. Hibernate braucht an dieser Stelle wesentlich mehr Informationen. Zum Einen muss die Assoziation geklärt werden. Alo OneToOne, OneToMany oder ManyToOne. In deinem Fall sollte das ManyToMany denn jeder Artikel kann mehreren OrderItems zugewiesen werden und jedes OrderItem hat eine Liste von Artikeln. Zum Anderen muss die Klasse angegeben werden, welche in der Datenbank persistiert werden soll, also Artikel. Schau am Besten mal in der Dokumentation vorbei. Da findest du alles was du brauchst.
Wie sieht denn die Klasse Artikel aus und deren Mapping?
 
Code:
Hallo, danke dir schonmal für die Antwort. Zwischenzeitlich habe ich das OrderItem Mapping etwas umgebaut und es mit <List> probiert:

Code:
<list name="orderContentList" cascade="all">
            <key column="ARTICLE_ID"/>
            <list-index column="idX"/>
            <!-- Ein OrderItem hat mehrere Artikel -->
            <one-to-many class="Article"/>        
        </list>

Du meinst Many-To-Many? Ich dachte 1 OrderItem kann mehrere Artikel enthalten.

Per Button erstelle ich Artikel und speichere diese dann in einer Liste in einem Objekt OrderItem.

Dies hat auch erstmal funktioniert und die Tabellen wurden angelegt, leider werden sie dann nicht mit inhalt gefüllt.

FehlerMeldung:

IllegalArgumentException in class: pizza.OrderItem, setter method of property: orderContentList
Aug 26, 2014 2:15:46 PM org.hibernate.property.BasicPropertyAccessor$BasicSetter set
ERROR: HHH000091: Expected type: javafx.collections.ObservableList, actual value: org.hibernate.collection.internal.PersistentList
IllegalArgumentException occurred while calling setter for property [pizza.OrderItem.orderContentList (expected type = javafx.collections.ObservableList)]; target = [Name= StringProperty [value: Pizza 1]
Price= FloatProperty [value: 3.0]
], property value = [[Name= StringProperty [value: Grundpizza]
Price= FloatProperty [value: 3.0]

Mit diesem Aufruf habe ich es probiert: session.save(orderItemList.get(0));

Artikel habe ich vorhin vergessen, sieht so aus:

Code:
 <class name="pizza.Article" table="Article">
        <id name="id" column="ARTICLE_ID">
            <generator class="native"/>
        </id>
        <property name="name" />
        <property name="price"/>        
    </class>

€: ich habe mich an dem offiziellen Tutorial orientiert.

€2: Problem gelöst.
Man kann nur java.util.List mappen...

So sieht meins jetzt aus:

Code:
<list name="orderInhaltList" table="orderartikel">
            <key column="id"/>
            <list-index column="lfd_nr"/>
            <composite-element class="pizza.PizzaTopping">
                <property name="name"/>
                <property name="price"/>
            </composite-element>
        </list>

key column ist der Fremschlüssel und listindex der index der Liste damit Java die richtige Reihenfolge wieder herstellen kann.
 
Zuletzt bearbeitet:
Zurück
Oben