2013-09-06 4 views
0

Рассмотрите арку контроллера-службы-репозитория.Сущность становится отсоединенной, когда должно управляться.

Успешный метод в TokenService, заявляющий, что я верен к делу.

@Transactional 
public Token getByString(String tokenString) { 


    Token t = tr.loadTokenByString(tokenString); 

    t.setTokenType("SERVICE MODIF"); // note this test line works and changes are propagated to db 
    em.flush(); 


    return t; 
} 

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

logger.info(urlToken); 

     Object obj; 

     Token token; 

     obj = tokenService.getByString(urlToken); 
     User u; 
     if (obj != null) { 



      token = (Token) obj; 

      // tokenService.save(token); - am angry lost detached entity throwing exception that i am detached 

      token.setTokenType("helllo"); // this does not propagate to db since entity is detached 


      logger.info(token.toString()); 

      u = token.getUser(); 
      userService.activateUser(u); 

     } 

Как вы можете видеть из комментариев следующего setTokenType внутри вызова контроллера ничего не делает, таким образом, я назвал save, чтобы проверить состояние, которое без дальнейших угадываний уведомило меня о том, что сущность отделилась.

Означает ли это, что я должен делать все изменения внутри классов обслуживания? Что не так в контексте контроллера, если мне просто нужно вызвать один мутатор, я не хочу, чтобы меня заставляли создавать целую цепочку репозитория-службы, чтобы сделать его с контроллера O.o.

Я помню где-то глубоко в своем мозгу, что для какого-то магического фильтра есть требование для учета контекста контроллера, но это было давно, и я не могу вспомнить, какой фильтр требуется. Может быть, я совершенно неправ.

Я сомневаюсь, что смог бы merge внутри контроллера, так как asfaik даже .flush выбрасывает исключение, когда я забываю объявить услугу транзакционной. И я сомневаюсь, что это возможно или даже правильно, чтобы объявить метод обработчика обработчика транзакций и контекст постоянства autwire непосредственно для вызова merge.

Идеальный сценарий, конечно, состоял в том, чтобы поддерживать постоянное состояние объекта, даже когда оно получает доступ к цепному вызову контроллера.

ответ

0

Когда вы объявите этот метод транзакционным, он будет транзакционным. Это и только то.

После завершения транзакции вы не можете внести никаких изменений в это в том смысле, что независимо от того, какой ссылочный объект, с которым вы связаны, больше не управляется сеансом. (Поскольку транзакция завершена).

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

+0

hm, то в чем смысл «нового» ключевого слова в именованных запросах, если объекты можно отделить автоматически, передав их контроллерам? Что вы говорите, подразумевает, что всякий раз, когда я передаю объекты контроллеру, их можно безопасно модифицировать (чтобы соответствовать требованиям к просмотру) и отображаться для пользователя? – Aubergine