Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.
Toon posts:

[JAVA] hibernate - 1 op veel relaties - lezen data

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben nog zoekende in het hele Hibernate gebeuren, maar loop vast (ik vermoed een redeneerfout) bij het volgende:

DOEL:
Een lijst van items op een JSP pagina,
met bij elk item een lijst van de itemdetails:

MAPPING EN CLASSES:

==> volgende zaken aanwezig:
- Class Item: incl de variabele set<ItemDetails> met getter
- Item.hbm.xml: incl child element "set" die de associatie beschrijft
- Class ItemDetails: incl de variabele Item item met getter en setter
- ItemDetails.hbm.xml: incl many-to-one element

- verwijzing naar hbm.xml files in hibernate.cfg.xml
- een servlet die hetvolgende bevat: List<Item> items = new ItemService().find();
- een ItemService (Service Layer)
- ItemDAO (DAO layer)

Wanneer ik de associatie weghaal en enkel een lijst van de items ophaal, lukt dit.
Wanneer ik de associatie heb ingesteld, loopt het mis. Waar geef ik aan dat de lijst van itemdetails moet opgehaald worden (of doet hibernate dit zelf op basis van de mapping?)?

Kan iemand kort het principe schetsen dat ik moet volgen (al rondgeneusd op het net en in boeken gedoken, maar...)? of weet iemand een goede manual staan? Bij Hibernate zelf vind ik wel handleidingen, maar die lossen niet zozeer mijn probleem op.

Mercikes

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

In de Hibernate Reference Documentation staat in hoofdstuk 7 verschillende soorten associatieve mappings beschreven. Heb je hier iets aan gehad? Afhankelijk van de functionele eisen zou het voorbeeld in 7.2.1 of 7.4.1 afdoende zijn.

  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 11-11 15:07
Verwijderd schreef op zondag 05 oktober 2008 @ 22:18:
Ik ben nog zoekende in het hele Hibernate gebeuren, maar loop vast (ik vermoed een redeneerfout) bij het volgende:

DOEL:
Een lijst van items op een JSP pagina,
met bij elk item een lijst van de itemdetails:

MAPPING EN CLASSES:

==> volgende zaken aanwezig:
- Class Item: incl de variabele set<ItemDetails> met getter
- Item.hbm.xml: incl child element "set" die de associatie beschrijft
- Class ItemDetails: incl de variabele Item item met getter en setter
- ItemDetails.hbm.xml: incl many-to-one element
Dat klopt, je hebt nu wel een bi-directionele relatie beschreven.
- verwijzing naar hbm.xml files in hibernate.cfg.xml
- een servlet die hetvolgende bevat: List<Item> items = new ItemService().find();
- een ItemService (Service Layer)
- ItemDAO (DAO layer)
Als je nog zoekende bent zou ik even het thou-shalt-use-layers gospel overboord gooien en beginnen met iets als:

Java:
1
2
Item item = (Item)session.load(Item.class, new Integer(1));
System.out.println("aantal details van item 1: " + item.getItemDetails().getSize());
Wanneer ik de associatie weghaal en enkel een lijst van de items ophaal, lukt dit.
Wanneer ik de associatie heb ingesteld, loopt het mis. Waar geef ik aan dat de lijst van itemdetails moet opgehaald worden (of doet hibernate dit zelf op basis van de mapping?)?
"loopt het mis": wat is de foutmelding?

Wanneer de lijst moet worden opgehaald bepaalt hibernate aan de hand van de instellingen van de mapping en aan de hand van "lazy" resolution: de relatie wordt pas uit de database (of evt second-level cache) opgehaald wanneer de methode voor de relatie echt wordt aangeroepen. Hibernate "wrapt" je Item class dan ook, met gegenereerde methodes voor relaties die er voor zorgen dat die eerst worden opgehaald uit de database wanneer deze worden aangeroepen.
Kan iemand kort het principe schetsen dat ik moet volgen (al rondgeneusd op het net en in boeken gedoken, maar...)? of weet iemand een goede manual staan? Bij Hibernate zelf vind ik wel handleidingen, maar die lossen niet zozeer mijn probleem op.
Ik raad toch aan om de handleidingen te lezen, want het probleem wat je hebt komt omdat je hibernate nog aan het leren bent :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:43
Wat is de foutmelding ?
Kan je de relevante code hier posten (en de relevante gedeeltes uit de mapping file). Dan hebben we zowiezo al een beter zicht ...

[ Voor 48% gewijzigd door whoami op 06-10-2008 10:13 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
Alvast bedankt voor de tips. Ik probeer hier even de relevante code te posten. Ik had dit nog niet gedaan om niet de illusie te wekken dat jullie voor mij zouden moeten debuggen (want dat kan uiteraard de bedoeling niet zijn). Het is wel een behoorlijke lijst geworden.

Ik heb dus een servlet die van op een webpagina wordt opgeroepen,
die eigenlijk alles wat betreft de tabel module opzoekt,
en terug doorgeeft aan een JSP pagina.

DOEL: Een lijst van modules op een JSP pagina,
met bij elke module een lijst van de moduledetails:


Afwijkend met de lancering van de vraag spreken we hier over de tabel (en class) module en moduledetail.



1.A Class Module
Java:
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
public class Module {
    
    private int moduleId;
    private String moduleNaam;
    private Set<ModuleDetail>moduleDetails = new LinkedHashSet<ModuleDetail>();
    
    //constructor
    public Module(String moduleNaam,BigDecimal modulePrice){
        setModuleNaam(moduleNaam);
        setModulePrice(modulePrice);
    }
    
    protected Module(){}         
    
    //hier de associatie naar de details:  1 op veel relatie
    public Set<ModuleDetail>getModuleDetails(){
        return Collections.unmodifiableSet(moduleDetails);
    }
    public void addModuleDetail(ModuleDetail moduledetail){
        moduledetail.setModule(this);
    }
    Set<ModuleDetail>friendModuleDetails(){
        return moduleDetails;
    }
    public void removeModuleDetail(ModuleDetail moduleDetail){
        moduleDetail.setModule(null);
    }
    
    private void setModuleId (int moduleId){
        this.moduleId = moduleId;
    }
    ....... enzo verder ....


1.B Module.hbm.xml
Java:
1
2
3
4
5
6
...
 <set name="moduleDetails" access="field" order-by="moduledetailid" inverse="true">
            <key column="moduledetailllink" not-null="true"/>
            <one-to-many class="ModuleDetail" />
</set>
...



2.A Class ModuleDetail
Java:
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
public class ModuleDetail {
...
 private Module module;
...
protected ModuleDetail(){}  
    
    //ivm associatie
    public Module getModule(){
        return this.module;
    }
    public void setModule(Module module){
        if (this.getModule()!=null){
            this.getModule().friendModuleDetails().remove(this);
        }
        this.module = module;
        if (module != null){
            module.friendModuleDetails().add(this);
        }
    }
    
    @Override public int hashCode(){
        return getModuledetailid();
    }
    
    @Override public boolean equals(Object obj){
        if(!(obj instanceof ModuleDetail)){
            return false;
        }
        return ((ModuleDetail)obj).getModuledetailid()==this.getModuledetailid();
    }
    
    private void setModuledetailid (int moduledetailid){
        this.moduledetailid = moduledetailid;
    }    
    private int getModuledetailid (){
        return this.moduledetailid;
    }
...

2.B ModuleDetail.hbm.xml
Java:
1
2
3
4
5
6
7
 <class name="ModuleDetail" table="moduledetail">
        
        <id name="moduledetailid" column="moduledetailid">
            <generator class="native" />
        </id>
...
<many-to-one name="module" column="moduleid" not-null="true" access="field" />



3.A AbstractDAO
Java:
1
2
3
4
5
6
7
public abstract class AbstractDAO {
    
    protected Session getSession(){
        SessionFactory factory = HibernateUtil.getSessionFactory();
        return factory.getCurrentSession();
    }  
}

4.A ModuleDAO
Java:
1
2
3
4
5
6
7
8
9
public class ModuleDAO extends AbstractDAO {
    
    @SuppressWarnings("unchecked")
    public List<Module> find(){
        Session session = getSession();
        Query query = session.createQuery("from Module");
        return query.list();
    }
}



5.A AbstractServices
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public abstract class AbstractService {

    private Session getSession(){
        SessionFactory factory = HibernateUtil.getSessionFactory();
        return factory.getCurrentSession();
    }
    
    protected void beginTransaction(){
        Session session = getSession();
        session.beginTransaction();
    }
    
    protected void commit(){
        Session session = getSession();
        session.getTransaction().commit();
    }
    
    protected void rollback(){
        Session session = getSession();
        session.getTransaction().rollback();
    }    
}

5.b ModuleServices
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class ModuleService extends AbstractService {

    public List<Module> find(){
        List<Module> modules = null;
        
        try{
            beginTransaction();
            modules = new ModuleDAO().find();
            commit();
            return modules;
        }
        catch (RuntimeException ex){
            rollback();
            throw ex;
        }
    }    
}



6.A SERVLET
Java:
1
2
3
4
5
6
7
...
 try{
            List<Module> modules = new ModuleService().find();
            request.setAttribute("modules", modules);
        }
...
request.getRequestDispatcher("modules.jsp").forward(request, response);

Verwijderd

Topicstarter
En de fout (of 1 van de ...) :

Initial SessionFactory creation failed.org.hibernate.InvalidMappingException: Could not parse mapping document from resource be/reflected/entities/ModuleDetail.hbm.xml

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Deze foutmelding betekent min of meer dat de XML niet aan de DTD voldoet.

Gebruik je een plain vanilla teksteditor of een XML editor? Een beetje intelligente XML editor of een IDE (Eclipse) zou vooraf waarschuwingen geven wanneer je XML niet aan de DTD voldoet. Herstel dit en ga verder.
Pagina: 1