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 :

Définir l'ordre de génération des colonnes


Sujet :

JPA Java

  1. #1
    Membre confirmé
    Avatar de Khaled.Noordin
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 354
    Points : 497
    Points
    497
    Billets dans le blog
    1
    Par défaut Définir l'ordre de génération des colonnes
    Bonjour/Bonsoir
    Je génère mes table avec JPA 2.0 et Hibernate,
    dans mon schéma j'utilise une clé composite décrit par l'annotation @IdClass,
    seulement la génération des colonnes ne suit pas l'ordre de déclaration du code, j'aimerai savoir si il existe une façon de dire à JPA, que tel ou tel colonne vient avant ou après celle ci, et que la composition de la clé prend en premier tel ou tel champs?
    voici mon code
    Code java : 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    package organization.basis.domain.model.security.groups;
     
    import org.apache.commons.lang.builder.EqualsBuilder;
    import org.apache.commons.lang.builder.HashCodeBuilder;
    import org.apache.commons.lang.builder.ToStringBuilder;
     
    import java.io.Serializable;
     
    /**
     *
     * @author Khaled.Noordin
     */
    public class GroupAuthoritiesId implements Serializable {
     
     private static final long serialVersionUID = 1516747697065512431L;
     private Groups groups;
     private String authority;
     
     public Groups getGroups() {
      return groups;
     }
     
     public String getAuthority() {
      return authority;
     }
     
     public void setGroups(Groups groups) {
      this.groups = groups;
     }
     
     public void setAuthority(String authority) {
      this.authority = authority;
     }
     
     @Override
     public String toString() {
      return ToStringBuilder.reflectionToString(this);
     }
     
     @Override
     public int hashCode() {
      return HashCodeBuilder.reflectionHashCode(this);
     }
     
     @Override
     public boolean equals(Object object) {
      return ( !( object instanceof GroupAuthoritiesId )
              || object == null ) ? false
              : EqualsBuilder.reflectionEquals(
              this,
              object);
     }
    }


    Code java : 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
    package organization.basis.domain.model.security.groups;
     
    import org.apache.commons.lang.builder.EqualsBuilder;
    import org.apache.commons.lang.builder.HashCodeBuilder;
    import org.apache.commons.lang.builder.ToStringBuilder;
    import org.hibernate.annotations.Index;
     
    import javax.persistence.*;
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Size;
    import javax.xml.bind.annotation.XmlRootElement;
    import java.io.Serializable;
     
    /**
     *
     * @author Khaled.Noordin
     */
    @Entity
    @Table(name = "group_authorities")
    @Access(value = AccessType.PROPERTY)
    @IdClass(value = GroupAuthoritiesId.class)
    @XmlRootElement
    @NamedQueries({
     @NamedQuery(name = "GroupAuthorities.findAll",
     query = "SELECT g FROM GroupAuthorities g"),
     @NamedQuery(name = "GroupAuthorities.findByGroups",
     query = "SELECT g FROM GroupAuthorities g WHERE g.groups = :groups"),
     @NamedQuery(name = "GroupAuthorities.findByAuthority",
     query = "SELECT g FROM GroupAuthorities g WHERE g.authority = :authority")
    })
    public class GroupAuthorities implements Serializable {
     
     private static final long serialVersionUID = 3665548523131336391L;
     private Groups groups;
     private String authority;
     
     public GroupAuthorities() {
      this.groups = null;
      this.authority = null;
     
     }
     
     public GroupAuthorities(
             Groups groups,
             String authority) {
      this();
      this.groups = groups;
      this.authority = authority;
     }
     
     public GroupAuthorities(
             GroupAuthoritiesId groupAuthoritiesId) {
      this(groupAuthoritiesId.getGroups(),
              groupAuthoritiesId.getAuthority());
     }
     
     @Id
     @JoinColumn(name = "group_id",
     referencedColumnName = "id",
     insertable = false,
     updatable = false)
     @ManyToOne(optional = false)
     public Groups getGroups() {
      return groups;
     }
     
     @Id
     @Basic(optional = false)
     @NotNull
     @Size(min = 1, max = 50)
     @Column(name = "authority")
     @Index(name = "idx_group_auth_autority")
     public String getAuthority() {
      return authority;
     }
     
     public void setGroups(Groups groups) {
      this.groups = groups;
     }
     
     public void setAuthority(String authority) {
      this.authority = authority;
     }
     
     @Override
     public String toString() {
      return ToStringBuilder.reflectionToString(this);
     }
     
     @Override
     public int hashCode() {
      return HashCodeBuilder.reflectionHashCode(this);
     }
     
     @Override
     public boolean equals(Object object) {
      return ( !( object instanceof GroupAuthorities )
              || object == null ) ? false
              : EqualsBuilder.reflectionEquals(
              this,
              object);
     }
    }

    voici le sql généré
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TABLE `group_authorities` (
      `authority` varchar(255) NOT NULL,
      `group_id` bigint(20) NOT NULL,
      PRIMARY KEY (`authority`,`group_id`),
      KEY `idx_group_auth_autority` (`authority`),
      KEY `FK771BA161B605BC9F` (`group_id`),
      CONSTRAINT `FK771BA161B605BC9F` FOREIGN KEY (`group_id`) REFERENCES `groups` (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    le sql attendu
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    create table group_authorities(
    group_id bigint(20) unsigned not null,
    authority varchar(50) not null,
    constraint fk_group_authorities_group
    foreign key(group_id) references groups(id),
    primary key(group_id,authority)
    )ENGINE=InnoDB DEFAULT CHARSET=utf8;

    Cordialement, Khaled

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 127
    Points : 208
    Points
    208
    Par défaut
    Bonjour,

    Je ne l'ai pas expérimenté, mais je crois savoir que Hibernate génère les colonnes dans l'ordre alphabétique, même si c'est plus une constatation qu'une règle officiellement déclarée, donc tu pourrais jouer avec ça.

    Sinon, à moins que tu aies vraiment besoin de la création automatique des tables, pourquoi ne pas prendre le script généré, le modifier comme tu le souhaite et créer les tables "à la main" ? ça ne devrait pas perturber Hibernate, qui lui n'utilise sûrement pas de "Select *" pour accéder aux colonnes.

    Après, tu as peut-être de bonnes raisons que j'ignore, à toi de voir.

    Cordialement

  3. #3
    Membre confirmé
    Avatar de Khaled.Noordin
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 354
    Points : 497
    Points
    497
    Billets dans le blog
    1
    Par défaut
    Bonjour/Bonsoir
    merci semaphore1984, de ton intérêt pour le sujet.
    La raison pour laquelle je veux un schéma précis c'est que je projette d'utiliser spring security,
    qui a des schémas de base de données précis pour aider à la sécurité d'une application que l'on peut retrouver sur ce lien,
    spring utilise des jdbcTemplate donc il est je pense indispensable de coller au schéma attendu par les jdbcTemplate de spring.
    Seulement je ne veux pas que lors du déploiement de mon application
    j'ai a lancer des script sql de génération de table,
    car je veux me que ma génération de schéma soit indépendante de la base en présence
    donc obligé d'avoir une couche ORM qui donne exactement ce que spring attend.
    Ainsi, je pense que au moment du déploiement en mode(ddl) update
    il sera obligatoire de lancer un petit alter table par du jdbc,
    si il n'existe pas une solution de configuration de l'ORM assez fine.
    Et par la suite en redémarrage de l'application en mode(ddl) validate,
    pour l'ORM l'ordre des clé dans la composite ne sera pas ressentis.

    par du jdbc je verrai la solution comme ça avec une native query qui je pense est assez generique à tous les sgbd
    Code java : 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    package organization.basis.domain.model.security.groups;
     
    import org.apache.commons.lang.builder.EqualsBuilder;
    import org.apache.commons.lang.builder.HashCodeBuilder;
    import org.apache.commons.lang.builder.ToStringBuilder;
    import org.hibernate.annotations.Index;
     
    import javax.persistence.*;
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Size;
    import javax.xml.bind.annotation.XmlRootElement;
    import java.io.Serializable;
     
    /**
     *
     * @author Khaled.Noordin
     */
    @Entity
    @Table(name = GroupAuthorities.PROP_ENTITY_TABLE)
    @Access(value = AccessType.PROPERTY)
    @IdClass(value = GroupAuthoritiesId.class)
    @XmlRootElement
    @NamedNativeQuery(name = GroupAuthorities.NATIVENAMEDQUERY_FIXPK,
    query = "ALTER TABLE "
    + GroupAuthorities.PROP_ENTITY_TABLE
    + " DROP PRIMARY KEY ;"
    + "ALTER TABLE "
    + GroupAuthorities.PROP_ENTITY_TABLE
    + " ADD PRIMARY KEY ("
    + GroupAuthorities.PROP_GROUPS
    + ","
    + GroupAuthorities.PROP_AUTHORITY + ");")
    @NamedQueries({
     @NamedQuery(name = GroupAuthorities.NAMEDQUERY_FINDALL,
     query = "SELECT g FROM GroupAuthorities g"),
     @NamedQuery(name = GroupAuthorities.NAMEDQUERY_FINDBYGROUPS,
     query = "SELECT g FROM GroupAuthorities g WHERE g.groups = :groups"),
     @NamedQuery(name = GroupAuthorities.NAMEDQUERY_FINDBYAUTHORITY,
     query = "SELECT g FROM GroupAuthorities g WHERE g.authority = :authority")
    })
    public class GroupAuthorities implements Serializable {
     
     private static final long serialVersionUID = 3665548523131336391L;
     public static final String PROP_ENTITY_TABLE = "group_authorities";
     public static final String PROP_AUTHORITY = "authority";
     public static final String PROP_GROUPS = "group_id";
     public static final String NAMEDQUERY_FINDALL =
             "GroupAuthorities.findAll";
     public static final String NAMEDQUERY_FINDBYGROUPS =
             "GroupAuthorities.findByGroups";
     public static final String NAMEDQUERY_FINDBYAUTHORITY =
             "GroupAuthorities.findByAuthority";
     public static final String NATIVENAMEDQUERY_FIXPK =
             "GroupAuthorities.fixPK";
     private Groups groups;
     private String authority;
     
     public GroupAuthorities() {
      this.groups = null;
      this.authority = null;
     
     }
     
     public GroupAuthorities(
             Groups groups,
             String authority) {
      this();
      this.groups = groups;
      this.authority = authority;
     }
     
     public GroupAuthorities(
             GroupAuthoritiesId groupAuthoritiesId) {
      this(groupAuthoritiesId.getGroups(),
              groupAuthoritiesId.getAuthority());
     }
     
     @Id
     @JoinColumn(name = PROP_GROUPS,
     referencedColumnName = Groups.PROP_ID,
     insertable = false,
     updatable = false)
     @ManyToOne(optional = false)
     public Groups getGroups() {
      return groups;
     }
     
     @Id
     @Basic(optional = false)
     @NotNull
     @Size(min = 1, max = 50)
     @Column(name = PROP_AUTHORITY)
     @Index(name = "idx_group_auth_autority")
     public String getAuthority() {
      return authority;
     }
     
     public void setGroups(Groups groups) {
      this.groups = groups;
     }
     
     public void setAuthority(String authority) {
      this.authority = authority;
     }
     
     @Override
     public String toString() {
      return ToStringBuilder.reflectionToString(this);
     }
     
     @Override
     public int hashCode() {
      return HashCodeBuilder.reflectionHashCode(this);
     }
     
     @Override
     public boolean equals(Object object) {
      return ( !( object instanceof GroupAuthorities )
              || object == null ) ? false
              : EqualsBuilder.reflectionEquals(
              this,
              object);
     }
    }

    apres test de cette option, il s'avere que
    org.hibernate.cfg.NotYetImplementedException: Pure native scalar queries are not yet supported
    donc je vais passer par une solution qui ressemble à ça
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    getEntityManager().createNativeQuery(stringNativeQuery);

    Cordialement Khaled

  4. #4
    Membre confirmé
    Avatar de Khaled.Noordin
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 354
    Points : 497
    Points
    497
    Billets dans le blog
    1
    Par défaut
    Bonjour/Bonsoir
    En substance pour faire rapide j'ai réussi à arriver à mes fins en passant par un appel de requête native au travers de JPA, voici une source à l'arrache histoire de partager un peu l'idée, et faire remarquer que les named native query sont du domaine de la manipulation de données et non de définition de données.

    Code java : 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    package organization.basis.domain.dao.jpa.fix;
     
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.EntityTransaction;
    import javax.persistence.Persistence;
    import javax.persistence.Query;
     
    /**
     *
     * @author Khaled.Noordin
     */
    public class DummyFixDbSchema {
     
     public static void main(String[] args) {
      try {
       EntityManagerFactory emf =
               Persistence.createEntityManagerFactory("org_basisPUTest");
       EntityManager em = emf.createEntityManager();
       EntityTransaction tx = em.getTransaction();
       tx.begin();
       Query query1 = em.createNativeQuery("ALTER TABLE group_authorities DROP PRIMARY KEY;");
       query1.executeUpdate();
       tx.commit();
       tx.begin();
       Query query2 = em.createNativeQuery("ALTER TABLE group_authorities ADD PRIMARY KEY (group_id, authority);");
       query2.executeUpdate();
       tx.commit();
       em.close();
       emf.close();
      }
      catch (Exception e) {
       System.err.println(e.getMessage());
      }
     }
    }

    Cordialement Khaled

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 17/06/2008, 11h28
  2. Définir en wordML la taille des colonnes d'un tableau
    Par apmic dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 06/06/2007, 15h52
  3. Réponses: 7
    Dernier message: 22/09/2006, 15h52
  4. Réponses: 3
    Dernier message: 23/10/2005, 22h06

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