i'm having problems mapping manytoone parent child relationship. onetomany collection populates lazily fine. however, inverse single entity, not.
i have table of server instances, immutable.
when create list of servers, populates collection of requests server has assigned without problems.
when add new request, , select server preferred dropdown, saveorupdate, (or tried load, , get) not populate server property in request instance.
server.java
public class server { private int serverid; private list<request> requests; ... @onetomany(mappedby="server", fetch=fetchtype.lazy) public list<request> getrequests() { return requests; } }
request.java
public class request { private int requestid; private int server_serverid; // foreign key server.serverid private server server; ... @manytoone(fetch=fetchtype.lazy) @joincolumn(name="server_serverid", nullable=false, updatable=false, insertable=false} @foreignkey(name="server_serverid", inversename="serverid") // don't think public server getserver() { return server; } }
add.jsp (add request form)
... <form:select id="preferred-server" path="server.serverid"> <c:foreach items="${servers}" var="server"> <form:option value="${server.serverid}">${server.servername}</form:option> </c:foreach> </form:select> ...
addrequestcontroller.java
public class addrequestcontroller extends simpleformcontroller { ... @override protected modelandview onsubmit(object command) throws exception { request request = (request)command; try { logger.info("before save, request.server = " + request.getserver()); } catch (nullpointerexception npe) { logger.error("onsubmit() caught npe: " + npe); } // rather not these next 2 lines. prefer saveorupdate // request, , have populate server property via server_serverid foreign key. //server server = serverdao.loadbyserverid(request.getserver_serverid()); //request.setserver(server); //added instead, calls gethibernatetemplate().refresh(server, lockmode.read) serverdao.refreshserver(request.getserver()); requestdao.addrequest(request); // calls gethibernatetemplate.saveorupdate(request) try { logger.info("after save, request.server = " + request.getserver()); } catch (nullpointerexception npe) { logger.error("onsubmit() caught npe: " + npe); } return new modelandview(getsuccessview(), "request", request); } }
i've tried virtually every combination of annotation mapping find online, , setup works fetching collection of requests.
now, of course, can request command object simpleformcontroller, load server object based on user selects, , persist way--but that's not point of relationship mapping, it?
any suggestions? let me know if require other code.
using: spring 2.5, hibernate 3.2.5, sybase db
the problem request
owning side, need add server request, i.e. call setserver()
. server
field 1 responsible corresponding column in database.
it not sufficient add request list since inverse mapping. if you'd set server in request , reload server db, request should automatically added list (although you'd not manually add server list well).
thus request should this:
public class request { private int requestid; //i don't see need //private int server_serverid; // foreign key server.serverid private server server; ... @manytoone ( fetch=fetchtype.lazy ) //employ lazy loading, can put on @onetomany @joincolumn( name="server_serverid", nullable=false } public server getserver() { return server; } }
Comments
Post a Comment