2011-05-10 4 views
0

J'ai un OneToMany relation entre un résident de classe et ResidentInfo ResidentInfo n'est pas censé existe sans résident, mais ResidentInfo n'est pas nécessaireJPA (veille prolongée) relation OneToMany et nulle

Voici mes classes:

public class Resident { 
... 
    @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, mappedBy = "resident") 
    @Cascade({org.hibernate.annotations.CascadeType.ALL}) 
    public List<ResidentInfo> infos; 
} 

public class ResidentInfo { 
... 
    @ManyToOne(optional = false) 
    public Resident resident; 
    public String label; 
    public String value; 
} 
Je suis nouveau à JPA et peut-être que je fais des choses fausses.

Le problème est que lorsque j'essaie d'insérer des données à la fois (créer résident et ses infos en même temps), j'ai une exception nulle.

C'est parce que ResidentInfo.resident.id est nulle (mais je ne peux pas spécifier une valeur parce que résident est créé dans le même temps!)

De plus, même si le résident est créé d'abord, j'ai cette erreur mais je ne sais pas pourquoi:

detached entity passed to persist: models.ResidentInfo 

Alors, comment résoudre ces problèmes?

Répondre

2

Pour résoudre votre problème, vous devez d'abord fournir une méthode setter dans la classe ResidentInfo pour définir l'objet Resident auquel appartient l'instance info. Il pourrait ressembler à ceci

public void setResident(Resident resident) { 
    this.resident = resident; 
} 

En outre l'ajout d'un objet ResidentInfo à un objet résident ne doit être fait dans la classe de résident. Vous devez fournir une méthode pour ajouter un nouvel objet ResidentInfo à la liste contenue. Une partie de l'ajout de l'objet ResidentInfo consiste à définir l'objet Resident qui lui est associé. Le code pourrait ressembler à ceci

public void addResidentInfo(ResidentInfo residentInfo) { 
    residentInfo.setResident(this); 
    infos.add(residentInfo); 
} 

Avec ces lignes chaque objet dans la liste contient une référence à l'instance résident qui lui est associé. Ainsi, lorsque vous persistez tous les objets, les références nécessaires (ainsi que tout ID requis) sont définies. Sur une note de côté, vous devriez vérifier vos informations Cascade dans l'annotation JPA. Vous avez fourni deux annotations différentes avec une signification très différente.

+0

Bonjour, j'ai supprimé "cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}" est-ce correct? J'ai aussi testé votre code, cela ne fonctionne que partiellement, quand je veux ajouter un nouveau ResidentInfo à un résident existant cela ne fonctionne pas – Bouki

+0

Que voulez-vous dire, cela ne fonctionne pas? Quel est le résultat lorsque vous ajoutez un nouveau ResidentInfo en utilisant la méthode spécifiée? – Osiris76

+0

Je n'ai pas d'erreur, mais tous les enregistrements ResidentInfos ne sont pas insérés – Bouki

Questions connexes