Comment aurais-je carte une relation parent/enfant sur le même objet avec JPA
Après la lecture de ce post JPA carte de la relation entité parentID j'ai essayé de l'appliquer à mon code mais cela ne fonctionne pas pour moi.
C'est le code que j'ai dans mon Objet
@Entity
public class Category extends Model {
public static final int EASY = 1;
public static final int MEDIUM = 2;
public static final int HARD = 3;
public static final int VERRY_HARD = 4;
public String name;
public String fullName;
public boolean active;
public Date createdOn;
public int difficulty;
@ManyToOne
@JoinColumn(name = "FK_PARENT_CATEGORY")
public Category parentCategory;
@OneToMany(mappedBy="parentCategory", cascade = CascadeType.ALL)
public List<Category> subCategories;
public Category(Category parentCategory, String name, boolean active) {
this.name = name;
this.active = active;
this.parentCategory = parentCategory;
this.subCategories = new ArrayList<Category>();
this.createdOn = new Date();
this.difficulty = Category.EASY;
this.fullName = name;
if (parentCategory != null)
this.fullName = parentCategory.fullName + "/" + this.fullName;
}
Maintenant, c'est le test que j'ai exécuter
@Test
public void testParentAndSubCategories() {
//Create the parent category
new Category(null, "Sport", true).save();
Category sportCat = Category.find("byName", "Sport").first();
//Test the newly created parent category state
assertNotNull(sportCat);
assertEquals("Sport", sportCat.name);
assertEquals(true, sportCat.active);
assertEquals("Sport", sportCat.fullName);
assertNull(sportCat.parentCategory);
assertEquals(0, sportCat.subCategories.size());
//Create the subCategory
new Category(sportCat, "Hockey", false).save();
Category hockeyCat = Category.find("byName", "Hockey").first();
//Test the newly created sub category
assertNotNull(hockeyCat);
assertEquals("Hockey", hockeyCat.name);
assertEquals(false, hockeyCat.active);
assertEquals("Sport/Hockey", hockeyCat.fullName);
assertNotNull(hockeyCat.parentCategory);
assertEquals("Sport", hockeyCat.parentCategory.name);
assertEquals(0, sportCat.subCategories.size());
//Fetch new values for parent category
sportCat = Category.find("byName", "Sport").first();
//Test updated parent category
assertEquals(1, sportCat.subCategories.size());
assertEquals("Hockey", sportCat.subCategories.get(0).name);
}
Cette ligne de le test échoue toujours.
//Test updated parent category
assertEquals(1, sportCat.subCategories.size());
Basé sur la configuration que j'ai pour mes relations, Hibernate ne peut pas récupérer de la sous-catégorie et je ne sais pas pourquoi. Maintenant, j'ai vraiment espère vraiment que ce n'est pas quelque chose de stupide de ma part parce que je vais me tirer une balle (Même si il est tard et je suis fatigué). Par le moyen n'est pas l'esprit du public des variables dans le code, je suis en utilisant le jeu!(playframework) et il prend soin de l'encapsulation. Merci d'avance pour toute aide
Vous devez vous connecter pour publier un commentaire.
Il n'est pas un problème de cartographie parent et l'enfant à la même classe. - Le problème, c'est que vous avez besoin pour maintenir les deux extrémités de la bi-directionnelle-relation à la main.
BTW: Paramètre uniquement sur un côté (celui qui est responsable pour stocker la relation dans la base de données), de stocker et recharger l'entité de travail dans certains cas. (Et vous trouverez ce sale truc dans de nombreux anciens tutoriels). Mais à mon avis c'est une mauvaise pratique. (Dans votre cas de test, il aurait besoin de nettoyer le cache avant de recharger la mère après que l'enfant est sauvé.)
Le code qui est indiqué dans votre question, n'ajoute rien à
subCategories
. Il ne l'initialiser avec une liste vide. Je pense que vous avez besoin de quelque chose commeDonc, ce que je comprends (et de lire) votre code correctement, Hibernate n'est pas (ne peut pas) récupérer les sous-catégories car il reste vide après l'appel de
new Category(sportCat, "Hockey", false).save();
Vous s'attendaient probablement à être assez à ajouter de l'entité mère à l'enfant, mais de ce que j'ai vu, Hibernate vous oblige à maintenir les deux extrémités de l'un-à-plusieurs relations.
En d'autres termes, vous devez ajouter de l'enfant de la Catégorie du parent à la liste des catégories.
Il est décrit ici:
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/example-parentchild.html#example-parentchild-bidir
Et aussi ici (avec un supplément de la mise en cache de l'émission):
Hibernate @OneToMany avec mappedBy (parent-enfant) de la relation et de la problème de cache