Bonjour à tous,
Je début à JPA et je me confronte à un premier problème :
J'ai une classe Tool et une classe Category. Un Tool a 1 et 1 seule Category. Une Category a entre 0 et n Tools. J'aimerai faire une relation uni-directionnel pour que dans les tables générées un Tool contient un champ contenant l'id d'une Category.
Mes classes Tool.java et Category.java :
La classe Category java est un simple pojo auquel j'ai rajouté les annotations classiques pour un EJB entity : @Entity, @Id et @GeneratedValue.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 @Entity public class Tool implements Serializable { @Id @GeneratedValue private int id; @ManyToOne(cascade=CascadeType.ALL) @NotNull private Category category; // + constructeur prenant une category, et getters/setters classiques }
Mon code de test :
Mon problème :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 //[...] Category category = new Category(); categories.add(category); // cette méthode contient un appel du type em.persist .... for(int i = 0 ; i < 10 ; i++) tools.add(new Tool(category)); // em.persist ..... //[...]
Au niveau des tables générées dans la base de données, tout est correct. Parcontre, le code de test me rajoute bien 10 nouveaux Tools dans la table. Le problème est qu'il m'a également rajouté 11 Category (les 10 de la boucle + la première), alors que je n'en voudrai qu'une seule.
Je me doute bien que le problème vient du CascadeType, le problème est que si je l'enlève j'ai une runtime exception : not-null property references a null or transient value: com.alu.tms.entities.Tool.category) Et si en plus j'enlève le NotNull : Can't commit because the transaction is in aborted state
Voilà... Quelqu'un pourrait t'il m'éclairer? Merci d'avance !![]()
Partager