IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JPA Java Discussion :

Création base de données à partir d'entités existantes


Sujet :

JPA Java

  1. #1
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut Création base de données à partir d'entités existantes
    Bonjour bonjour,

    J'ai une erreur lors de tentative de génération d'un script sql à partir des entités, et quand je cherche sur notre moteur de recherche favoris, je trouve des solutions qui ne correspondent pas à mon cas (enfin je pense):

    The embeddable class [com.areva.td.acts.entities.CoreTapId] is used in classes with conflicting access types. Class [com.areva.td.acts.entities.TapLinear] uses access [PROPERTY] and class [com.areva.td.acts.entities.CoreTap] uses access [FIELD]. When sharing an embeddable object between classes, the access types of those embedding class must be the same.
    Sauf que, dans la classe CoreTap, l'attribut EmbeddedId est bel et bien sur le getter, et non sur le champ:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    @Entity
    @Table(name = "T_CORE_TAP", uniqueConstraints = {})
    public class CoreTap implements java.io.Serializable {
     
        //...
     
        private CoreTapId id;
     
        //...
     
        @AuditElement(order = 0)
        @EmbeddedId
        @AttributeOverrides({
                @AttributeOverride(name = "nmCore", column = @Column(name = "NM_CORE", unique = false, nullable = false, insertable = true, updatable = true, precision = 2, scale = 0)),
                @AttributeOverride(name = "nmTap", column = @Column(name = "NM_TAP", unique = false, nullable = false, insertable = true, updatable = true, precision = 1, scale = 0)),
                @AttributeOverride(name = "dcQuotationNumber", column = @Column(name = "DC_QUOTATION_NUMBER", unique = false, nullable = false, insertable = true, updatable = true, length = 8)),
                @AttributeOverride(name = "dcQuotationItem", column = @Column(name = "DC_QUOTATION_ITEM", unique = false, nullable = false, insertable = true, updatable = true, length = 5)) })
        public CoreTapId getId() {
            return this.id;
        }
     
        //...
    }
    Quand j'essaie de rajouter @Access(AccessType.PROPERTY) sur la classe CoreTapId (méthode que j'ai pu voir dans quelques exemples sur le net):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @Embeddable
    @Access(AccessType.PROPERTY)
    public class CoreTapId implements java.io.Serializable {
     
        //...
    J'ai l'erreur suivante (toujours lors de la generation des tables à partir des entités):
    Entity class [class com.areva.td.acts.entities.CoreTap] has no primary key specified. It should define either an @Id, @EmbeddedId or an @IdClass. If you have defined PK using any of these annotations then make sure that you do not have mixed access-type (both fields and properties annotated) in your entity class hierarchy.

    Est-ce que quelqu'un a une idée?

    Merci d'avance
    J’ai des questions à toutes vos réponses!

  2. #2
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Les annotations JPA suivent la norme JavaBeans

    Si tu mets l'annotation @EmbeddedId sur le champ private CoreTapId id, la valeur sera interrogée avec la méthode getId() par introspection. Donc essaye de mettre l'annotation sur la variable plutôt que sur le getter

    Après tout, ton champ est private, donc personne d'autre que la classe ne peut le voir.
    Je ne suis pas mort, j'ai du travail !

  3. #3
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Ca a l'air de fonctionner! Une idée de pourquoi je peux pas mettre le type d'acces à PROPERTY?

    Le truc c'est que ce n'est pas mon projet, et je suis en charge de l'intégrer dans l'appli web dont j'ai la charge depuis quelques mois.
    Et en plus je ne connais rien à cette techno.. Depuis Lundi je vais d'erreur en erreur..

    Après une 30aine de @EmbeddedId déplacés des getters vers les champs, on dirait qu'il faut que je passe à l'ajout de @Temporal pour les dates
    J’ai des questions à toutes vos réponses!

  4. #4
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Alors, le @Access(AccessType.PROPERTY), il aurait fallu le mettre sur ta classe CoreTap et pas sur la classe CoreTapId (je le vois que maintenant)

    C'est la classe CoreTap qui doit être inspectée par propriété plutôt que par champ.
    Donc met le @Access(AccessType.PROPERTY) sur CoreTap et laisse le @EmbeddedId sur ton getter, ça devrait marcher pareil


    Bonne chance pour la suite !
    Je ne suis pas mort, j'ai du travail !

  5. #5
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Aah ok. Merci pour ton aide eulbobo!
    J’ai des questions à toutes vos réponses!

  6. #6
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Bonjour,

    J'ai passé ces derniers jours à configurer le projet dans eclipse (determiner les technologies utilisées, les dépendances, etc) et maintenant je suis capable de générer un script sans avoir à changer le code! Je suis assez content de ça, ca me permet de ne pas toucher au code métier auquel dje ne comprend rien (calculs magnétiques, sismiques, etc.).



    Je reviens vers vous pour un autre problème.. Toujours à propos de la génération de la base de données SQL à partir des entités, c'est pourquoi je n'ouvre pas d'autre thread.

    Je touche au but dans cette génération de base de données! Sauf que le script de création des tables n'est pas écrit dans la bonne version de language SQL.

    En effet, quand je copie-colle dans SQL Server Managamanent Studio le script généré, il me souligne le type DOUBLE:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        create table T_BASE (
            CD_BASE varchar(20) not null,
            CD_UNIT_OWNER varchar(6),
            CD_UNIT_UPDATE varchar(6),
            DC_BASE_PLAN_CLASS varchar(2),
            DC_PLAN_NUMBER varchar(20),
            DT_LAST_TECHNICAL_UPDATED timestamp not null,
            MD_BASE_FIXING_GAUGE bigint not null,
            MD_HEIGHT bigint not null,
            MD_SEISMIC_CONDITION_CLASS double, --Erreur, SQL server management ne s'attend apparement pas à avoir un type double..
            NO_USER_OWNER varchar(256),
            NO_USER_UPDATE varchar(256),
            QT_NUMBER_SECONDARY_TERM_BOX bigint not null,
            primary key (CD_BASE)
        );

    J'imagine qu'il y a un endroit dans eclipse ou je dois spécifié la bonne version de SQL language pour le script à générer? ou bien un endroit où je dois spécifier le driver à utiliser? ou bien encore, je dois changer toutes les annotations??? ça serait la pire des solutions car comme vous l'avez compris je n'ai pas envie de toucher au code..

    Aurize-vous une idée de comment je peux configurer ça dans eclipse?
    J’ai des questions à toutes vos réponses!

  7. #7
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Tu utilises quelle implémentation de JPA? Histoire qu'on puisse te dire où regarder


    C'est une histoire de dialecte qui ne doit pas être bien configuré (le dialecte fait la transformation dans le langage base de données correspondant à la base que tu utilises)
    Je ne suis pas mort, j'ai du travail !

  8. #8
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Oui je viens de trouver des solutions où il faut référencer des types de column (registerColumnType()) mais je ne sais pas trop où et comment je dois procéder.

    Je te met quelques infos sur le projet (pertinentes ou non, j'apprend en même temps que j'essaie les choses...)

    Pour l'implémentation de JPA, j'utilise Hibernate (JPA 2.1).
    J'ai suivi un tuto qui expliquait comment faire une User Library à partir de la release final d'Hibernate.
    A la base, le projet fonctionne avec une base Oracle.


    J'ai remarqué qu'en changeant le dialect dans le fichier perstistence.xml (HSQLDialect,SQLServer2008Dialect, SQLServerDialect, OracleDialect, etc..), le script de création des tables n'était pas le même. Avec le dialect oracle, j'ai bien double précision! Est ce que ca a à voir avec le fait que la base de données d'origine était Oracle? Faut-il que je change les annotations en conséquence?
    J’ai des questions à toutes vos réponses!

  9. #9
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    J'ai du répondre assez vite, je ne voulais pas rater le bus pour me ramener à la maison!

    A la base, le projet fonctionnait avec une base Oracle, alors que je veux générer pour une base SQL.
    Après avoir essayé plusieurs dialects différents (dans persistence.xml), aucun parmis ceux que j'ai jugé potentiellement compatible avec ce que je veux,
    aucun n'a donné le résultat attendu.

    Citation Envoyé par -N4w4k- Voir le message
    Faut-il que je change les annotations en conséquence?
    Je pensais que ca pouvait venir de là, étant donné que le code était prévu pour Oracle, mais en fait les annotations concernées ont l'air très génériques:
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        @AuditElement(order=1)
        @Column(name = "MD_SEISMIC_CONDITION_CLASS", unique = false, nullable = true, insertable = true, updatable = true, precision = 10)
        public Double getMdSeismicConditionClass() {
            return this.mdSeismicConditionClass;
        }

    Voila, voila. Si tu as une idée, je suis preneur! Je continue de chercher.
    J’ai des questions à toutes vos réponses!

  10. #10
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Ha oui, si tu étais sur Oracle et que tu utilises une base SQLServer, il faut changer le dialecte dans ton fichier persistence.xml pour mettre quelque chose que ta base comprendra (la liste ici : http://docs.jboss.org/hibernate/orm/...e-summary.html )
    Je ne suis pas mort, j'ai du travail !

  11. #11
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Oui j'étais tombé sur cette page pendant mes essais, mais aucun des dialects que j'ai pu essayer n'avaient fonctionnés.
    Par contre je ne sais pas à quoi j'ai touché mais je ne parviens plus à générer le script de création depuis 1h
    Sans aucun message d'erreur, j'ai un peu de mal à débugger..

    Je réessaierai les différents dialects quand ca refonctionnera.
    J’ai des questions à toutes vos réponses!

  12. #12
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Okaaaayy... j'ai passé 2 jours à chercher les erreurs lors de la génération dans la fenetre Output, alors qu'il fallait regarder dans Error Log

    L'erreur était que les sequence generators ne sont pas disponibles pour SQL! En passant le dialect d'Oracle à SQL, j'ai reveillé la bête
    Il m'a suffit de passer la stratégie de génération de GenerationType.SEQUENCE à GenerationType.AUTO (ayant apparement le même comportement) pour les quelques Id auto-générés du projet.

    Du coup, le fait d'avoir changé le dialect vers SQLDialect me génère bien un script valide!

    Merci encore eulbobo!

    Je passe le sujet en résolu vu que j'ai mes tables créées
    J’ai des questions à toutes vos réponses!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Création d'une base de données à partir d'une autre
    Par chh2008 dans le forum Débuter
    Réponses: 0
    Dernier message: 21/06/2010, 09h43
  2. Création Base de Données à partir d'une base Modèle
    Par AVE_ISEO dans le forum Import/Export
    Réponses: 0
    Dernier message: 26/02/2010, 11h04
  3. Réponses: 8
    Dernier message: 13/01/2010, 10h34
  4. [MySQL] Création base de données à partir d'un fichier XML
    Par kaya57200 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 08/12/2009, 22h58
  5. Création base de données à partir d'un scirpt
    Par adel53 dans le forum Débuter
    Réponses: 2
    Dernier message: 21/11/2008, 17h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo