У меня проблемы с отображением ManyToOne в отношениях между родителями и детьми.Коллекция OneToMany наполнена лениво отлично.Тем не менее, обратное к одной сущности, нет.
У меня есть таблица экземпляров сервера, которая является неизменной.
Когда я создаю список серверов, он заполняет коллекцию запросовчто сервер назначил ему без проблем.
Когда я добавляю новый запрос и выбираю предпочтительный сервер из выпадающего списка, saveOrUpdate, (или даже пытался загрузить и получить), он не заполняет свойство серверав экземпляре запроса.
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 to 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 this really does anything
public Server getServer() {
return server;
}
}
add.jsp (Добавить форму запроса)
...
<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);
}
// Would rather not do these next two lines. Would prefer to saveOrUpdate
// Request, and have it populate server property via server_serverId foreign key.
//Server server = serverDao.loadByServerId(request.getServer_serverId());
//request.setServer(server);
//Added this instead, which 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);
}
}
Я пробовал практически все комбинации сопоставления аннотаций, которые я мог найти в Интернете, и это настройка, которая работает с получением Коллекции запросов.
СейчасКонечно, я могу получить свой объект команды Request из SimpleFormController, загрузить объект Server на основе того, что выбрал пользователь, и сохранить его таким образом - но это не точка сопоставления отношений, нетw это?
Есть предложения?Дайте мне знать, если вам нужен какой-либо другой код.
Использование: Spring 2.5, Hibernate 3.2.5, Sybase DB