Карта аннотации в спящем режиме для отношений между родителями и детьми? - PullRequest
4 голосов
/ 29 апреля 2011

У меня проблемы с отображением 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

1 Ответ

1 голос
/ 29 апреля 2011

Проблема в том, что Request является владельцем, поэтому вам нужно добавить сервер в запрос, т.е. позвонить setServer().Поле server отвечает за соответствующий столбец в вашей базе данных.

Недостаточно добавить запрос в список, поскольку это только обратное отображение.Если вы установите сервер в запросе, а затем перезагрузите сервер из базы данных, запрос должен автоматически добавиться в список (хотя обычно вы этого не делаете, но также добавляете сервер в список вручную).

Таким образом, запрос должен выглядеть так:

public class Request {

 private int requestId;
 //I don't see any need for this
 //private int server_serverId; // foreign key to Server.serverId
 private Server server;
 ...
 @ManyToOne ( fetch=FetchType.LAZY ) //employ lazy loading, you can put that on @OneToMany too
 @JoinColumn( name="server_serverId", nullable=false }
 public Server getServer() {
  return server;
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...