2011-01-10 1 views
1

J'ai très simple requête sur le nom JPA (TopLink):table préfixes TopLink avec TL_ pendant la mise à jour le fonctionnement

UPDATE Server s SET s.isECM = 0 

Je ne porte pas de cache ou de la validité des entités déjà pré-chargés. Mais la connexion à la base de données est effectuée à partir du compte restreint (seulement INSERT/UPDATE/DELETE). Il est apparu que TopLink sur cette requête exécute (et a échoué car TL_Server est existe pas) SQL très étrange:

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] 

Qu'est-ce que cela? Comment la simple mise à jour apparaît un INSERT? Pourquoi effectuer une requête de lien TL_?

Répondre

2

Le TL_Server est une table temporaire. Parce que la requête UpdateAll est déterminée pour être complexe, la table temporaire doit être utilisée. Je suppose qu'il est déterminé d'être complexe parce que la classe a plusieurs tables, donc elles doivent être jointes, ce qui ne peut pas être fait sur une simple mise à jour.

Si votre classe avait juste une seule table, alors une simple mise à jour serait faite.

En cas d'échec, cela pose un problème avec la prise en charge de la table temporaire de votre plate-forme de base de données. Vérifiez que vous définissez correctement "toplink.target-database". Quelle base de données utilisez-vous?

Vous semblez utiliser une très ancienne version de TopLink Essentials? La prise en charge de UpdateAll s'est considérablement améliorée dans les dernières versions d'EclipseLink, vous pouvez envisager une mise à niveau.

Si vous ne pouvez pas l'utiliser avec TopLink Essentials, vous pouvez toujours utiliser une requête SQL native au lieu de JPQL.

+0

Il est clair pour moi pourquoi toplink a échoué (voir ci-dessus - parce que le compte de la base de données n'a pas l'autorisation de créer des tables, donc ant TL_ échouera). Ma question est de dire à toplink de ne pas utiliser de tables temporaires du tout? Ou faire un indice à JPA que c'est vraiment une requête très simple. En tout cas merci (+1) pour l'idée avec la requête native. – Dewfy

Questions connexes