JPA OneToMany - Collection est null
Je vais essayer de mettre en place une relation bidirectionnelle à l'aide de JPA. Je comprends qu'il est de la responsabilité de l'application afin de maintenir les deux côtés de la relation.
Par exemple, une Bibliothèque de plusieurs Livres. Dans la Bibliothèque de l'entité que j'ai:
@Entity
public class Library {
..
@OneToMany(mappedBy = "library", cascade = CascadeType.ALL)
private Collection<Book> books;
public void addBook(Book b) {
this.books.add(b);
if(b.getLibrary() != this)
b.setLibrary(this);
}
..
}
Le Livre-entité:
@Entity
public class Book {
..
@ManyToOne
@JoinColumn(name = "LibraryId")
private Library library;
public void setLibrary(Library l) {
this.library = l;
if(!this.library.getBooks().contains(this))
this.library.getBooks().add(this);
}
..
}
Malheureusement, la collection à l'OneToMany côté est null. Ainsi, par exemple, un appel à setLibrary() échoue parce que ce.de la bibliothèque.getBooks().contient(ce) résultats dans une NullPointerException.
Est-ce un comportement normal? Dois-je créer une instance de la collecte de moi-même (ce qui semble un peu étrange), ou existe-il d'autres solutions?
OriginalL'auteur user3001511 | 2013-11-17
Vous devez vous connecter pour publier un commentaire.
Entités sont des objets Java. Les règles de base de Java ne sont pas changé simplement parce qu'il y est un
@Entity
annotation sur la classe.Donc, si vous instanciez un objet et de son constructeur n'a pas initialiser un champ, ce champ est initialisé à null.
Oui, il est de votre responsabilité de vous assurer que le constructeur initialise la collection, ou que toutes les méthodes de traiter avec la possibilité de valeurs null dans le champ.
Si vous obtenez une instance de cette entité de la base de données (à l'aide d'em.find(), une requête, ou en naviguant à travers les associations de joint entités), la collection ne sera jamais nulle, parce que JPA toujours initialiser la collection.
Non initialisée ou null - je obtenir une NullpointerException. @JBNizet vous écrivez, que "il est de votre responsabilité de vous assurer que le constructeur initialise la collection de" et ensuite, vous dites "JPA toujours initialiser la collection".
OUI je downvoted. NON, le problème était le même que le mien. Ne pensez-vous pas que vous vous contredisez avec les deux déclarations que j'ai cité? Que pensez-vous de la réponse de @MouseLearnJava? ... PS: j'ai essayé d'annuler ma downvote déjà, mais stackoverflow ne me laisse pas
Non, je n'ai pas. Si vous exécutez simplement
Library lib = new Library()
, JPA n'est pas impliqué. Vous avez une classe, et que vous créez une instance. Qui initialise les champs selon les instructions contenues dans le constructeur que vous avez écrit. D'autre part, lorsque vous neLibrary lib = em.find(Library.class, 42L)
, puis JPA est impliqué. Il trouve la ligne dans la base de données, les appels à la non-arg constructeur de la Bibliothèque, puis utilise la réflexion pour remplir l'ensemble de ses non-transitoire champs avec les données qu'il récupère à partir de la base de données.Si la collection de livres est paresseux, il ne sait pas quoi mettre dans la collection, mais il reste lnows qu'une bibliothèque possède une collection de 0-N livres, il initialise les livres de terrain avec une collection non initialisée proxy. La première fois, toute méthode est appelée sur la collection, qui va charger les livres de la DB et de remplir la collection, ou de jeter un LazyInitializationException si l'entité est détachée.
OriginalL'auteur JB Nizet
Il semble que les livres type de Collection dans la Bibliothèque de classe n'est pas initilized. Elle est nulle;
Ainsi, lorsque la classe addBook méthode pour ajouter un livre-objet de collection. Il cause NullPointerException.
Initilize et avoir un essai.
Changement
À
OriginalL'auteur MouseLearnJava
Essayer de définir le type d'extraction patrimoine de l'association à la hâte sur le OneToMany côté. En effet, vous pouvez laisser cette partie (ce.de la bibliothèque.getBooks().ajouter(cet)) pour être écrit dans une session:
OriginalL'auteur tmarwen