2009-08-30 6 views
1

ma question est très similaire à Changing the type of an entity preserving its ID, mais j'utilise plutôt InheritanceType.JOINED au lieu de Table_per_class. Cela signifie que je ne dois pas changer de table, juste pour créer une nouvelle sous-classe, avec le même identifiant que la superclasse. Pour résumer, j'ai une classe Person et un Doctor, qui étend Person et a le même id de celui-ci. Je dois récupérer une personne de la base de données et en faire un médecin, en conservant toutes les données de l'entité Personne, mais en créant des données supplémentaires pour le Docteur.jpa comment créer une nouvelle entité avec le même identifiant que l'entité parente (JOINED Inheritance)

Essayer de fusionner le médecin génère un nouvel identifiant, ce qui n'est pas valide pour moi.

Here's ce que dans le premier essayé Ive a lieu

private Person getDoctor(Person person) { 
      // Person already a doctor ==> OK 
    if (person instanceof Doctor) { 
     return person; 
    } 
      // Transient Person ==> //Transient Doctor OK 
    if (person == null) { 
     return new Doctor(); 
    } 
      // Creates a Doctor from the person (only setting id...), 
      // and merges it ==> 
      fails as the id changes. 
    Doctor doctor = new Doctor(person); 
    return personDAO.merge(doctor); 
} 

sorry guys,first time here. 

Here´s the code above: 

    private Person getDoctor(Person person) { 
    //Person already a doctor ==> OK 
     if (person instanceof Doctor) { 
      return person; 
    } 


    //Transient Person ==> //Transient Doctor OK 
     if (person == null) { 
     return new Doctor(); 
     } 
    //Creates a Doctor from the person (only setting id...), and merges it ==> fails as the id changes. 
    Doctor doctor = new Doctor(person); 
    return personDAO.merge(doctor); 
    } 


    @Inheritance(strategy = InheritanceType.JOINED) 
    @Entity 
    public class Person{ 
    } 

    @Entity 
    public class Doctor extends Person{ 
     public Doctor(Person person) { 
     if (person != null) { 
      this.setId(person.getId()); 
     } 
    } 
    } 

Répondre

3

Tout comme dans la question que vous avez lié à, la réponse est « vous ne pouvez pas le faire en utilisant Hibernate API ". La raison en est assez claire - Hibernate vise à rendre la persistance la plus transparente possible et, par conséquent, ne peut pas vous permettre de faire des choses avec des objets persistants que vous ne pourriez pas faire avec les Java normaux. Une fois que vous créez une instance de Person (en java simple), il s'agit toujours d'un Person. Ce ne sera JAMAIS un Doctor. Le mieux que vous puissiez faire est de créer une instance Doctor et de lui copier les attributs de Person. Contrairement à java, Hibernate vous permet de tricher et de réaliser ce que vous voulez :-) mais cela doit être fait par SQL natif. Dans votre méthode, vous devrez:

  1. Evict Person exemple de la session (et cache de niveau 2 le cas échéant)
  2. Insérer une ligne avec l'ID correspondant (prise de Person par exemple) dans le tableau Doctors. C'est la partie qui doit être faite en tant que SQL natif, mais vous pouvez le définir en tant que requête nommée et définir l'ID ci-dessus en tant que paramètre. Notez que si vous avez des contraintes sur les propriétés Doctor, vous devez vous assurer que les valeurs que vous insérez les satisfont.
  3. Recharger Person instance - qui va maintenant être chargé comme Doctor.
Questions connexes