Причина в рекурсии: вы звоните $em->flush();
от абонента, EntityManager вводит flush
, запускает событие preFlush
, которое вызывает ваш обработчик, который снова вызывает $em->flush()
и т. Д.
IIRC preFlush вызывается перед вычислением набора изменений, так что простого обновления вашей сущности новым значением должно быть достаточно, чтобы Doctrine обнаружила указанное изменение.
Необходимо записать DLL с помощью Собственного интерфейса Java (JNI), поскольку Вы не можете сделать этого с чистым кодом Java.
Сам DLL должен вызвать функцию CreateProcessAsUser для создания процесса в контексте другого пользователя. Для успешного создания того процесса, необходимо предоставить маркер доступа функции, которая была самостоятельно создана путем вызывания функции LogonUser (это берет имя пользователя и пароль к authentify что другой пользователь).
В зависимости от Ваших потребностей Win32 API "CreateProcessWithLogonW" легче использовать, чем "CreateProcessAsUser / LogonUser" функции.
Из документов MSDN:
The CreateProcessWithLogonW and CreateProcessWithTokenW functions are similar to the CreateProcessAsUser function, except that the caller does not need to call the LogonUser function to authenticate the user and get a token
Существует программа под названием "runas.exe". Вы могли выполнить тот процесс и предоставить соответствующие аргументы в пользу Вашего процесса и имени пользователя/пароля. Я думаю, что это - самый простой метод.
RUNAS имеет переключатель "/savecred", которые позволяют Вам ввести учетные данные только в первый раз. Одна потенциальная проблема состоит в том, что, когда/SaveCred сохраняет учетные данные, это сохраняет его для того, каждый раз, когда RUNAS вызывает ту учетную запись пользователя. Это может быть огромной угрозой безопасности так быть тщательным использованием его!
Пример по http://www.rgagnon.com/javadetails/java-0014.html (в конце)
Я только что наткнулся на альтернативу программе runas.exe под названием MiniRunAs, которая принимает пароль в командной строке - http: // www .source-code.biz / snippets / c / 1.htm
Если вы можете установить его вместе со своим приложением, это может оказаться проще, чем писать JNI DLL.