2010-09-23 14 views
4

Supposons qu'un propriétaire possède une collection de Watch (s). J'essaye de créer des montres et d'ajouter les montres nouvellement créées à la collection de montres d'un propriétaire existant (une arraylist).GAE JPA DataNucleus Création d'objets One-to-Many

Ma méthode est la suivante:

public void add(String ownerName, String watchName) { 

    Owner o = new OwnerDAO().retrieve(ownerName); //retrieves owner object without fail 

    EntityManager em = EMF.get().createEntityManager(); 
    EntityTransaction t = em.getTransaction(); 

    Watch w = new Watch(watchName); 

    Owner owner = em.merge(o); 

    t.begin(); 
    owner.getWatches().add(w); 
    t.commit(); 

    em.close(); 

} 

Le code fonctionne dans l'environnement GAE local sans problème, mais a donné le problème suivant quand il est sur l'environnement GAE en ligne:

org.datanucleus.store.mapped.scostore.FKListStore$1 fetchFields: Object "[email protected]" has a collection "package.Owner.watches" yet element "[email protected]" doesnt have the owner set. Managing the relation and setting the owner. Puis-je savoir comment résoudre ce problème? Je vous remercie!

Les entités:

Propriétaire:

@id 
private String name; 

@OneToMany(mappedBy = "owner", 
targetEntity = Watch.class, cascade = CascadeType.ALL) 
private List<Watch> watches= new ArrayList<Watch>(); 

montre:

@id 
private String name; 

@ManyToOne() 
private Owner owner; 

Merci beaucoup à l'avance!

, Cordiales salutations

Jason

+0

Honnêtement, je ne sais pas si cette question devrait se fermer en double ou non, mais le fait est que il y a beaucoup de (très) des questions similaires: http://stackoverflow.com/questions/ 2 600021/1m-relation-en-hibernate-and-cascading-operations, http://stackoverflow.com/questions/2921314/hibernate-annotated-many-to-one-not-adding-child-to-parent-collection, etc. Je suppose que c'est juste difficile de les trouver quand vous ne savez pas ce que vous cherchez. –

+0

Merci, Pascal! Tu as raison; Tout ce que j'avais, c'était le message d'erreur, et je n'avais aucune idée de la direction à suivre pour trouver la réponse. J'ai essayé de chercher des solutions basées sur le message d'erreur mais en vain. – Jason

+0

Vous avez fait un très bon point ici et je crois maintenant que cette question pourrait être utile lorsque googling pour le même "message d'erreur". –

Répondre

3

Votre association est bidirectionnelle mais vous n'êtes pas régler les deux côtés du lien correctement, comme indiqué par le message d'erreur. Votre code devrait être:

... 
owner.getWatches().add(w); 
w.setOwner(owner); //set the other side of the relation 
t.commit(); 

Un modèle typique est d'utiliser des méthodes de gestion des liens de défense pour définir correctement les deux côtés de l'association, comme celui-ci (en Owner):

public void addToWatches(Watch watch) { 
    watches.add(watch); 
    watch.setOwner(this); 
} 

Et votre code deviendrait :

... 
owner.addToWatches(w); 
t.commit();