Comment puis-je ajouter une colonne à une entité JPA, et garder mes données?
Pendant le développement d'une application JPA, j'ai ajouté un champ "type" d'une entité. Cela a provoqué l'échec de l'application pour démarrer avec
Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.2.v20100323-r6872): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: Column 'T1.TYPE' is either not in any table in the FROM list or appears within a join specification and is outside the scope of the join specification or appears in a HAVING clause and is not in the GROUP BY list. If this is a CREATE or ALTER TABLE statement then 'T1.TYPE' is not a column in the target table.
Error Code: -1
lors d'une sélection.
Est-il un moyen de l'obtenir pour ALTER TABLE au démarrage, pour correspondre à l'entité actuelle des définitions?
J'ai remarqué que lorsque l'application démarre, il appelle CRÉER une TABLE pour chaque table, échoue et se conduit.
Dans le passé, lorsque j'ai ajouté les champs à des entités je viens de supprimer la base de données et commencer à nouveau. C'est ok pour moi pour l'instant mais si je veux ajouter un champ à une entrée lors de l'élaboration de la prochaine version du logiciel, comment puis-je mettre à jour mes clients sans perdre toutes t-il des données?
Merci à l'avance - Phil.
OriginalL'auteur Phil | 2011-04-11
Vous devez vous connecter pour publier un commentaire.
En règle générale, la base de données des générateurs de JPA fournisseurs ne sont pas fiable pour la création et la mise à jour des bases de données de production. Supposons que, dans la version 1 de vous a un champ nommé
name
pour votreUser
entité et dans la version 2 vous remplacez la parfirstName
etlastName
. Dans de tels cas, la DB générateur est pas en mesure de migrer votre schéma correctement.En d'autres termes, le fournisseur JPA automatique de la DB génération est uniquement utile pour le développement et non pour la production.
Au lieu de cela, vous pouvez envisager d'utiliser une base de données de l'outil de migration comme LiquiBase.
Avoir dit que, bien que EclipseLink ne prend pas en charge un moyen pour la mise à jour, plutôt que de re-création, de tables à l'aide de la
eclipselink.ddl-generation
propriété, certains autres JPA fournisseurs (par exemple, la mise en veille) charge la mise à jour de la base de données des tables. Toutefois, ils ne peuvent pas être invoqué pour une utilisation en production, car ils ne parviennent pas dans un cas comme dans l'exemple donné.EclipseLink 2.4 prend en charge une nouvelle option pour modifier une table existante, "eclipselink.ddl-génération" ="créer ou étendre des tables"
James, peut-on utiliser cette nouvelle option, alors que, dans la production ou fait quoi @Behrang est de mentionner au sujet de la fiabilité continuent de s'appliquer.
OriginalL'auteur Behrang
Vous pouvez remplacer les tables dans EclipseLink l'aide,
"eclipselink.ddl-génération" = "drop-and-créer des tables"
EclipseLink ne supporte pas modifier les tables existantes, veuillez vous connecter d'une demande d'amélioration pour le présent et voter pour elle.
En général, il est normalement préférable d'avoir un DBA définir un script pour définir le schéma de production et de gérer la migration.
OriginalL'auteur James
Pour la référence, si vous avez fait la même avec DataNucleus et spécifié une valeur par défaut pour le nouveau champ (colonne) et vous avez eu l'pertinentes à la persistance de la propriété réglé pour permettre les mises à jour de schéma alors il serait question d'une "ALTER TABLE ADD COLONNE ..." et d'être bien.
Un changement comme celui que vous mentionnez est l'un des très rares qui ne peut pas être fait automatiquement; depuis votre classe ne contient pas d'information sur ce qui était l'ancienne colonne(s) et quelle est la nouvelle colonne(s). Aucune raison n'a pas à utiliser la fonction de fonctionnalités pour les autres situations.
Si vous utilisez l'auto-génération, quand il travaille et s'appuient sur des scripts, LiquiBase, ou quelque chose comme ça, quand ça ne fonctionne pas, dans la même application? Sonne comme un entretien cauchemar pour moi.
OriginalL'auteur DataNucleus
Ne vous l'utilisez avec JSF?
Son très très facile ensuite. L'unité de persistance (persistence.xml) peut déposer et créer des tables pour vous.
Cette option est seulement pour le développement, pas de mise à niveau des tables... Et ce que cela a à voir avec la JSF?
OriginalL'auteur dav