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 :

Problème avec InheritanceType.JOINED sous postgres?


Sujet :

JPA Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Problème avec InheritanceType.JOINED sous postgres?
    Salut à tous,

    Voici pour tous les GEEKs Hibernate, j'ai problème d'héritage avec principalement le stratégie: "InheritanceType.JOINED". Ci-joint les mes différentes classes.

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    @Entity
    @javax.persistence.Table(name= "EMP", schema= "edu")
     
    @Inheritance(strategy= InheritanceType.JOINED)
    @DiscriminatorColumn(name= "EMP_TYPE", discriminatorType= DiscriminatorType.STRING)
    public abstract class Employee {
     
    	@Column(name = "NAME_") private String name;
     
    	@Column(name = "S_DATE") @Temporal(TemporalType.DATE) private Date startDate;
     
    	@Id private long id= System.currentTimeMillis();
     
    	public long getId() {
    		return id;
    	}
     
    	public void setId(long id) {
    		this.id = id;
    	}
     
    	public String getName() {
    		return name;
    	}
     
    	public void setName(String name) {
    		this.name = name;
    	}
     
    	public Date getStartDate() {
    		return startDate;
    	}
     
    	public void setStartDate(Date startDate) {
    		this.startDate = startDate;
    	}
     
    	public String toString() {
    		return "Employee id: " + getId() + " name: " + getName();
    	}
    }
    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
     
    @Entity
    @javax.persistence.Table(name= "PT_EMP", schema= "edu")
    @DiscriminatorValue("3")
    public class PartTimeEmployee extends Employee {
     
    	@Column(name = "H_RATE")
    	private float hourlyRate;
     
    	public float getHourlyRate() {
    		return hourlyRate;
    	}
     
    	public void setHourlyRate(float hourlyRate) {
    		this.hourlyRate = hourlyRate;
    	}
     
    	public String toString() {
    		return "PartTimeEmployee id: " + getId() + " name: " + getName();
    	}
    }
    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
    25
    26
    27
    28
     
    @Entity
    @javax.persistence.Table(name= "FT_EMP", schema= "edu")
    @DiscriminatorValue("2")
    public class FullTimeEmployee extends Employee {
    	private long salary;
    	private long pension;
     
    	public long getPension() {
    		return pension;
    	}
     
    	public void setPension(long pension) {
    		this.pension = pension;
    	}
     
    	public long getSalary() {
    		return salary;
    	}
     
    	public void setSalary(long salary) {
    		this.salary = salary;
    	}
     
    	public String toString() {
    		return "FullTimeEmployee id: " + getId() + " name: " + getName();
    	}
    }
    Comme vous pouvez le constater, il s'agit d'un héritage assez simple. Mais mon problème est le suivant. Dès que passe ma stratégie d'héritage à "InheritanceType.JOINED", la colonne "EMP_TYPE" n'est pas générée. Mais si j'utilise les deux autres stratégies, tout se passe nikel.

    Quelqu'un aurait-il une idée?
    Voici ma config. technique.
    Hibernate3 --> 3.6.4
    Base postgres --> 9.0
    name : PostgreSQL
    version : 9.0.1
    major : 9
    minor : 0
    Driver ->
    name : PostgreSQL Native Driver
    version : PostgreSQL 8.4 JDBC3 (build 702)
    major : 8
    minor : 4

    Jar -> postgresql-8.4-702.jdbc3.jar

    Bon voilà tout. Je suis preneur de tout proposition.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 957
    Points : 4 386
    Points
    4 386
    Par défaut
    a. @DiscriminatorColumn n'a pas de raison d'être utilisé par le code de l'ORM qui implémente la strategy InheritanceType.JOINED : il n'y a rien d'anormal.
    Si vous avez besoin de cette valeur pour des raisons legacy, assignez-la vous-même.

    b. "@Id private long id= System.currentTimeMillis();" un @Id assigné par le code sans que la stratégie @GeneratedValue soit explicitement déclarée "assigned" ne fonctionnera pas.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Salut JeitEmgie,

    Ayant suivi point par point tes préconisations, le résultat reste inchangé. Voici en capture des nouvelles classes ainsi que les tables générées.

    Classes:

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    @Entity
    @javax.persistence.Table(name= "EMP", schema= "edu")
     
    @Inheritance(strategy= InheritanceType.JOINED)
    public abstract class Employee {
     
    	@Column(name = "NAME_")
    	private String name;
     
    	@Column(name = "S_DATE")
    	@Temporal(TemporalType.DATE)
    	private Date startDate;
     
    	@Id
        @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="EMP_SEQ")
        @SequenceGenerator(name="EMP_SEQ", sequenceName="EMP_SEQ", allocationSize=100)
    	private long id;
     
    	public long getId() {
    		return id;
    	}
     
    	public void setId(long id) {
    		this.id = id;
    	}
     
    	public String getName() {
    		return name;
    	}
     
    	public void setName(String name) {
    		this.name = name;
    	}
     
    	public Date getStartDate() {
    		return startDate;
    	}
     
    	public void setStartDate(Date startDate) {
    		this.startDate = startDate;
    	}
     
    	public String toString() {
    		return "Employee id: " + getId() + " name: " + getName();
    	}
    }
    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
     
    @Entity
    @javax.persistence.Table(name= "PT_EMP", schema= "edu")
    public class PartTimeEmployee extends Employee {
     
    	@Column(name = "H_RATE")
    	private float hourlyRate;
     
    	public float getHourlyRate() {
    		return hourlyRate;
    	}
     
    	public void setHourlyRate(float hourlyRate) {
    		this.hourlyRate = hourlyRate;
    	}
     
    	public String toString() {
    		return "PartTimeEmployee id: " + getId() + " name: " + getName();
    	}
    }
    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
    25
    26
    27
     
    @Entity
    @javax.persistence.Table(name= "FT_EMP", schema= "edu")
    public class FullTimeEmployee extends Employee {
    	private long salary;
    	private long pension;
     
    	public long getPension() {
    		return pension;
    	}
     
    	public void setPension(long pension) {
    		this.pension = pension;
    	}
     
    	public long getSalary() {
    		return salary;
    	}
     
    	public void setSalary(long salary) {
    		this.salary = salary;
    	}
     
    	public String toString() {
    		return "FullTimeEmployee id: " + getId() + " name: " + getName();
    	}
    }
    Tables:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE TABLE edu.emp
    (
      id bigint NOT NULL,
      name_ character varying(255),
      s_date date,
      CONSTRAINT emp_pkey PRIMARY KEY (id)
    )
    WITH (
      OIDS=FALSE
    );
    ALTER TABLE edu.emp OWNER TO edu;
    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
     
    CREATE TABLE edu.ft_emp
    (
      pension bigint NOT NULL,
      salary bigint NOT NULL,
      id bigint NOT NULL,
      CONSTRAINT ft_emp_pkey PRIMARY KEY (id),
      CONSTRAINT fk7c3f2db7829875c2 FOREIGN KEY (id)
          REFERENCES edu.emp (id) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION
    )
    WITH (
      OIDS=FALSE
    );
    ALTER TABLE edu.ft_emp OWNER TO edu;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE TABLE edu.pt_emp
    (
      h_rate real,
      id bigint NOT NULL,
      CONSTRAINT pt_emp_pkey PRIMARY KEY (id),
      CONSTRAINT fk8d4fa3ed829875c2 FOREIGN KEY (id)
          REFERENCES edu.emp (id) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION
    )
    WITH (
      OIDS=FALSE
    );
    ALTER TABLE edu.pt_emp OWNER TO edu;
    Comme tu peux le constater en apportant ces modifications, le résutat reste inchangé comme précédemment.

    Cdt.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 957
    Points : 4 386
    Points
    4 386
    Par défaut
    Utilisez la balise CODE !

    Voir
    http://opensource.atlassian.com/proj...browse/ANN-140

    En clair, avec Hibernate et la strategy JOINED @DiscriminatorColumn ne génère pas le champ (discordance avec la spec EJB), mais rien ne vous empêche de la déclarer vous-même avec @Column sur un champ et de l'assigner avec un @PrePersist, si vous avez besoin de cette colonne pour des raisons legacy.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Hey JeitEmgie,

    Je vens juste de lire ton billet. Je ne l'ai pas encore essayer mais je pense ce là fonctionnera au vue de ce que lu dans le log i.e: http://opensource.atlassian.com/proj...browse/ANN-140
    en tout cas je te fais un feedback asap. thx advance.

Discussions similaires

  1. problème avec les div sous Mozilla
    Par MrsFrizz dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 13/10/2005, 11h54
  2. problème avec z-index sous firefox ???
    Par SpaceFrog dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 22/09/2005, 20h39
  3. [Oracle] problème avec INNER JOIN
    Par Philofish dans le forum Langage SQL
    Réponses: 5
    Dernier message: 15/09/2005, 10h20
  4. [Sybase]Problème avec le BCP sous Solaris
    Par sl dans le forum Sybase
    Réponses: 3
    Dernier message: 09/09/2004, 07h56
  5. Problème avec une instruction OUTER /Postgres
    Par Volcomix dans le forum Langage SQL
    Réponses: 14
    Dernier message: 21/04/2004, 16h56

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