[Spring/Hibernate] Bind multi-select in onSubmit

Pagina: 1
Acties:

  • Bbfreak
  • Registratie: September 2002
  • Laatst online: 04-02 10:03
Probleem
De scripts die ik selecteer in een multi-select geven een error in onSubmit.

Wat heb ik?
JSP
XML:
1
2
3
4
5
6
7
8
<spring:bind path="sentinel.scripts">
    <select name="scripts" size="5" multiple="multiple">
            <c:forEach items="${scripts}"  var="script">
        <option value="${script.id}">${script.name}</option>
            </c:forEach>
        </select>
        <span class="fieldError">${status.errorMessage}</span>
</spring:bind>
sentinel.scripts is een List van script objecten.

FormController onSubmit
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
    public ModelAndView onSubmit(HttpServletRequest request,
                                 HttpServletResponse response, 
                                 Object command,
                                 BindException errors)
            throws Exception {
        if (log.isDebugEnabled()) {
            log.debug("entering 'onSubmit' method...");
        }

        Sentinel sentinel = (Sentinel) command;
        
        log.debug("n# scripts:" + sentinel.getScripts().size());

        if (request.getParameter("delete") != null) {
            log.debug("Sentinel ID: " + sentinel.getId());
            sentinelManager.removeSentinel(sentinel.getId().toString());
            request.getSession().setAttribute("message", 
                    getText("sentinel.deleted", sentinel.getHostName()));
        } else {
            sentinelManager.saveSentinel(sentinel);
            request.getSession().setAttribute("message",
                    getText("sentinel.saved", sentinel.getHostName()));
        }

        return new ModelAndView(getSuccessView());
    }

De log debug geeft wel de goede grootte weer.
Ik krijg toch een Exception en wel de volgende:
code:
1
2
org.springframework.orm.hibernate.HibernateSystemException: Unknown entity class: java.lang.String; nested exception is net.sf.hibernate.MappingException: Unknown entity class: java.lang.String
net.sf.hibernate.MappingException: Unknown entity class: java.lang.String

Wie weet wat ik fout doe of wie weet er een goed example om een many-to-many in Hibernate op te slaan?

Twitter @cmeerbeek / Halo Waypoint Profile


Verwijderd

edit, eerst niet goed gelezen.

Anyways, de foutmelding lijkt me duidelijk, ergens probeer je een String te saven. Dus zoek het eens dichter bij je managers en dao's.

[ Voor 77% gewijzigd door Verwijderd op 20-12-2005 12:23 ]


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Post je hibernate file eens + post ook de sourcecode van je entity. Ik denk dat er een verschil zit tussen de mapping en de javasource.

[ Voor 66% gewijzigd door Alarmnummer op 20-12-2005 12:36 ]


  • Bbfreak
  • Registratie: September 2002
  • Laatst online: 04-02 10:03
Alarmnummer schreef op dinsdag 20 december 2005 @ 12:30:
Post je hibernate file eens + post ook de sourcecode van je entity. Ik denk dat er een verschil zit tussen de mapping en de javasource.
Mapping:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    <class name="org.ymor.repman.model.Sentinel" table="app_sentinel">
        <id name="id" column="id" unsaved-value="null">
            <generator class="increment"/>
        </id>
        <property name="hostName" column="host_name" not-null="true"/>
        <property name="IP" column="IP" not-null="true"/>
        <property name="location" column="location" not-null="true"/>
        <property name="owner" column="owner" not-null="true"/>
        <property name="lct" column="lct" type="java.util.Date"/>
        <property name="lcd" column="lcd" type="java.util.Date"/> 
         
        <bag name="scripts" table="app_scriptsentinel">
            <key column="sentinel_id"/>
            <many-to-many column="script_id" class="org.ymor.repman.model.Script"/>
        </bag>
    </class>

Model:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Sentinel extends BaseObject {
    private List<Script> scripts;

    /**
     * @return Returns the set of scripts.
     */
    public List<Script> getScripts() {
        return scripts;
    }
    
    /**
     * @param script Add script to set of scripts.
     */
    public void addScript(Script script) {
        getScripts().add(script);
    }

    /**
     * @param scripts The scripts to set.
     */
    public void setScripts(List<Script> scripts) {
        this.scripts = scripts;
}


Ik heb een oplossing die werkt maar volgens mij niet de meeste elegante:
Java:
1
2
3
4
5
6
7
8
9
10
        List<Script> s = new ArrayList<Script>();
        Sentinel sentinel = (Sentinel) command;
        sentinel.setScripts(s);
        
        String[] scripts = (String[])request.getParameterValues("scripts");
        for(int i = 0; i < scripts.length; i++) {     
            log.debug("ID: " + scripts[i]);
            Script script = scriptManager.getScript(scripts[i]);
            sentinel.addScript(script);
        }     
Deze code staat in de onSubmit. Ik maak dus een nieuwe script lijst aan en zet die bij het command object. Vervolgens haal ik van de geselecteerde scripts de objecten op
adhv de id's die in de select options staan.
Deze objecten voeg ik toe aan de nieuwe lijst en deze save ik naar de database.

Kan dit niet op een andere manier?

[edit]
Het werkt nog niet helemaal goed want als ik een object wil veranderen dan geeft hij het formulier opnieuw weer met de gegeven waarden. De multi-select daarentegen wordt niet gevuld.

Het formulier:
Afbeeldingslocatie: http://www.yportal.nl/form.jpg

[ Voor 16% gewijzigd door Bbfreak op 20-12-2005 13:26 ]

Twitter @cmeerbeek / Halo Waypoint Profile