2010-02-23 6 views
0

Dans mon application printemps/openjpa, j'ai deux entités simples:JPA fusion problème

@Entity 
public class Game { 

@Id 
@GeneratedValue 
protected Long id; 
@ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE}) 
@JoinColumn(name = "target_id") 
protected GameObject target; 
...} 

@Entity 
public class GameObject { 

@Id 
@GeneratedValue 
protected Long id; 
@Column 
protected String name; 
@OneToMany(mappedBy = "target", cascade = CascadeType.ALL) 
protected Collection<Game> games; 
...} 

J'essaie de sauver objet de jeu avec associé targetObject:

@PersistenceContext 
protected EntityManager entityManager; 

@Override 
@Transactional 
public Game createEntity(Game entity) { 
    getEntityManager().persist(entity); 
    if (entity.getTarget() != null) { 
     entity.getTarget().getGames().add(this); 
    } 
    getEntityManager().getEntityManager().flush(); 
    return entity; 
} 

Et je reçois NullPointerException en ligne: entity.getTarget(). getGames() est toujours nul, event si je mets ici hashmap vide. :/Pourquoi

+0

Je pense que cela aiderait si vous pourriez montrer le code qui appelle 'createEntity'. En particulier, il serait bon que vous puissiez montrer que lorsque vous construisez votre GameObject, vous avez une ligne comme 'games = new ArrayList ();' – John

+0

où est la "fusion" du titre? – Bozho

Répondre

1

Je vous conseille d'avoir:

protected Collection<Game> games = new HashMap<Game>(); 

Ainsi, la valeur par défaut est une collection vide (bonnes pratiques), plutôt que null (mauvaise pratique)

+0

En effet, il est essentiel de prendre en charge merge() (au moins sur OpenJPA), si la valeur initiale est définie sur NULL, vous ne pouvez pas supprimer la collection lors d'une fusion() – comeGetSome