[Hibernate] one to many mapping

Pagina: 1
Acties:
  • 773 views sinds 30-01-2008
  • Reageer

  • Ti_Uhl
  • Registratie: Mei 2003
  • Laatst online: 19-09-2012
Ik ben wat aan het spelen met hibernate maar krijg het volgende niet opgelost.

Ik heb een database met 2 tabellen namelijk ps_album en ps_picture
In ps_picture heb ik album_id wat een FK is voor ps_album

Nu heb ik volgende mapping gemaakt

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="com.photoShare.model.Album" table="ps_album">
        <id name="id" column="id">
            <generator class="increment" />
        </id>

        <property name="name" column="name" />
        <property name="description" column="description" />
        <property name="location" column="location" />
        <property name="date" column="cdate" />
        <property name="frontPic" column="frontpic" />
        <property name="foldername" column="foldername" />
        <set name="pictures" cascade="all">
            <key column="album_id" />
            <one-to-many class="com.photoShare.model.Picture" />
        </set>
    </class>
</hibernate-mapping>


<hibernate-mapping>
    <class name="com.photoShare.model.Picture" table="ps_picture">
        <id name="id" column="id">
            <generator class="increment" />
        </id>
        
        <property name="album_id" column="album_id"/>
        <property name="filename" column="filename"/>
    </class>
</hibernate-mapping>


Mijn Album class zien er als volgt uit :

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.photoShare.model.DAO;

import java.util.HashSet;
import java.util.Set;


public class AlbumDAO {
    private int id;
    private String name;
    private String description;
    private String location;
    private String date;
    private int frontPic;
    private Set pictures;
    private String foldername;
    
    public AlbumDAO() {
        this.id = 0;
        this.name = new String();
        this.description = new String();
        this.location = new String();
        this.date = new String();
        this.frontPic = 0;
        this.foldername = new String();
        this.pictures = null;
    }
    
    public Set getPictures() {
        
        return pictures;
    }
    
    public void setPictures(Set list) {
        
        this.pictures = list;
    }

    ...
}

Als ik nu met volgende code probeer alles uit de db te halen krijg ik onderstaande exception :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DAOManager manager = new DAOManager();

        List<Album> albums = manager.getAlbums();

        for (Album album : albums) {
            System.out.println(album.getName());
            System.out.println(album.getDescription());
            HashSet pics = (HashSet) album.getPictures();
            Iterator i = pics.iterator();
            while (i.hasNext()) {
                Picture p = (Picture) i.next();
                System.out.println(p.getFilename());
            }
        }


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
javax.servlet.ServletException: org.hibernate.collection.PersistentSet
    org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1858)
    org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:446)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

root cause

java.lang.ClassCastException: org.hibernate.collection.PersistentSet
    com.photoShare.actions.Testhbm.execute(Testhbm.java:32)
    org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:53)
    org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:64)
    org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:48)
    org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
    org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
    org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
    org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:280)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1858)
    org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:446)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


Echter haalt hij wel alles uit ps_album Deze execption komt dus enkel op het moment dat ik die pictures eruit wil halen.

Ik heb ook al op google en hibernate forum zitten zoeken maar vind niet echt veel meer uitleg over hoe ik die mapping wel juist moet maken.

[ Voor 3% gewijzigd door Ti_Uhl op 24-10-2006 20:21 ]


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 15:05

Robtimus

me Robtimus no like you

Java:
1
2
java.lang.ClassCastException: org.hibernate.collection.PersistentSet
    com.photoShare.actions.Testhbm.execute(Testhbm.java:32)
ClassCastException, dit lijkt me de oorzaak:
Java:
1
HashSet pics = (HashSet) album.getPictures();

Weet je zeker dat album.getPictures() een HashSet() is? Uberhaupt, waarom cast je naar HashSet terwijl die niets biedt dat Set wel heeft (qua methods / fields)? Je declareert eerst prima als zijnde Set, om er daarna vanaf te wijken door een expliciete implementatie (HashSet) te gebruiken.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Ti_Uhl
  • Registratie: Mei 2003
  • Laatst online: 19-09-2012
IceManX schreef op dinsdag 24 oktober 2006 @ 23:29:
Java:
1
2
java.lang.ClassCastException: org.hibernate.collection.PersistentSet
    com.photoShare.actions.Testhbm.execute(Testhbm.java:32)
ClassCastException, dit lijkt me de oorzaak:
Java:
1
HashSet pics = (HashSet) album.getPictures();

Weet je zeker dat album.getPictures() een HashSet() is? Uberhaupt, waarom cast je naar HashSet terwijl die niets biedt dat Set wel heeft (qua methods / fields)? Je declareert eerst prima als zijnde Set, om er daarna vanaf te wijken door een expliciete implementatie (HashSet) te gebruiken.
Daar zat hem het addertje dus. Ik zie enkel niet goed in waarom ik van een Set niet kan Casten naar een HashSet, en eigenlijk is het ook totaal niet nodig dat ik dat ga doen :)

Iig het werkt nu :) thx !

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Java:
1
2
3
4
5
private Set pictures;

public Set getPictures() {
    return pictures;
}
Je declareert het hier als een Set en niet als een HashSet :)

Verder, je noemt de data wrapper class DAO (Data Access Object), terwijl het in essentie gewoon een ordinaire DTO is (Data Transfer Object). Ik zou het persoonlijk wel even hernoemen ;)

  • Ti_Uhl
  • Registratie: Mei 2003
  • Laatst online: 19-09-2012
Ik probeer een many to one mapping te maken, en hij werkt ook wel maar hij geeft volgens mij de verkeerde output.

Het gaat om 2 tabellen namelijk ps_picture en ps_album

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| id | name      | description | location | cdate | frontpic | foldername |
-------------------------------------------------------------------------------------------------
|  1 | changed | test            | here     | d        |          2 | test           

1 row in set (0.00 sec)

+----+----------+----------+
| id | album_id | filename |
+----+----------+----------+
|  1 |        1 | 1.jpg    |
|  2 |        1 | 2.jpg    |
|  3 |        1 | 3.jpg    |
+----+----------+----------+
3 rows in set (0.00 sec)


In ps_album zit dus frontpic dat een FK is naar ps_Picture en dus een Picture object moet worden.
Echter met volgende mapping doet hij het verkeerd

XML:
1
2
<many-to-one name="frontPic" column="frontpic"
            class="com.photoShare.model.dao.Picture" fetch="join" />


Hierbij geeft hij volgende sql :

Java:
1
2
3
4
5
Hibernate: select album0_.id as col_0_0_ from ps_album album0_

Hibernate: select album0_.id as id0_1_, album0_.name as name0_1_, album0_.description as descript3_0_1_, album0_.location as location0_1_, album0_.cdate as cdate0_1_, album0_.foldername as foldername0_1_, album0_.frontpic as frontpic0_1_, picture1_.id as id1_0_, picture1_.album_id as album2_1_0_, picture1_.filename as filename1_0_ from ps_album album0_ left outer join ps_picture picture1_ on album0_.frontpic=picture1_.id where album0_.id=?

Hibernate: select pictures0_.album_id as album2_1_, pictures0_.id as id1_, pictures0_.id as id1_0_, pictures0_.album_id as album2_1_0_, pictures0_.filename as filename1_0_ from ps_picture pictures0_ where pictures0_.album_id=? order by pictures0_.id


en als ik dan de filename van de frontpic uitlees geeft het 1.jpg, wat dus eigenlijk 2.jpg moet zijn ! :s

Iemand een oplossing? ik heb op google een paar references gevonden over die one-to-many mappings maar word er niet echt slimmer van :)

  • momania
  • Registratie: Mei 2000
  • Laatst online: 15:16

momania

iPhone 30! Bam!

Je itereert je albums wel goed, maar je pictures gewoon niet ;)

Java:
1
2
3
4
5
6
7
8
9
10
11
DAOManager manager = new DAOManager();

        List<Album> albums = manager.getAlbums();

        for (Album album : albums) {
            System.out.println(album.getName());
            System.out.println(album.getDescription());
            for (Picture p : album.getPictures()) {
                System.out.println(p.getFilename());
            }
        }


Set kan je vaak niet casten naar HashSet en is ook niet nuttig, aangezien Set de interface van HashSet is. Onder water gebruikt Hibernate trouwens een TreeSet, dus ook daarom gaat je cast mis.

Verder gewoon lekker tegen de interface blijven programmeren ;)

[ Voor 22% gewijzigd door momania op 25-10-2006 13:34 ]

Neem je whisky mee, is het te weinig... *zucht*

Pagina: 1