таблица префиксов toplink с TL_ во время операции обновления - PullRequest
2 голосов
/ 10 января 2011

У меня очень простой именованный запрос в JPA (toplink):

UPDATE Server s SET s.isECM = 0

Я не несу информацию о кеше или валидации уже загруженных объектовНо соединение с базой данных осуществляется с ограниченной учетной записи (только INSERT / UPDATE / DELETE).Оказалось, что toplink по этому запросу выполняется (и не удалось, поскольку TL_Server не существует) очень странный SQL:

INSERT INTO TL_Server (elementId, IsECM) 
    SELECT t0.ElementId, ? 
    FROM Element t0, Server t1 
    WHERE ((t1.elementId = t0.ElementId) AND (t0.elementType = ?))

bind => [0, Server]

Что это?Как простое ОБНОВЛЕНИЕ появляется ВСТАВКА?Почему toplink запрашивает TL _?

1 Ответ

2 голосов
/ 10 января 2011

TL_Server является временной таблицей. Поскольку запрос UpdateAll определяется как сложный, необходимо использовать временную таблицу. Я предполагаю, что он определен как сложный, потому что у класса есть несколько таблиц, поэтому они должны быть объединены, что невозможно сделать при простом обновлении.

Если у вас в классе только одна таблица, то будет сделано простое обновление.

Если это не удается, значит, это проблема с поддержкой временных таблиц вашей платформы базы данных. Убедитесь, что вы правильно настраиваете «toplink.target-database». Какую базу данных вы используете?

Вы, кажется, используете очень старую версию TopLink Essentials? Поддержка UpdateAll значительно улучшена в последних версиях EclipseLink, вы можете рассмотреть возможность обновления.

Если вы не можете заставить его работать с помощью TopLink Essentials, вы всегда можете просто использовать собственный SQL-запрос вместо JPQL.

...