Foreign key constraint fails
Je voudrais
J'ai une entité Cocktail et une entité CategorieCocktail.
Un Cocktail a plusieurs catégories et une catégorie peut avoir plusieurs cocktails.
J'ai une table cocktail avec pour colonnes ( id, name, recette),
une table categoriecocktail avec (id, name)
une table belong_to avec 2 colonnes (cocktail_id, categorie_id)
Je veux pouvoir créer des nouveaux cocktails en choisissant un name, une recette et une liste de catégories. Pour cela, mes catégories existent déjà en base.
Le problème est lorsque je désire persister mon nouveau cocktail dans la base, il y a un problème de transient object car par persistance, l'entitymanager veut insérer une nouvelle fois les catégories sélectionnées pour le cocktail.
Je voudrais éviter de devoir créer un POJO Cocktailcategorie avec pour attributs les 2 clés primaires. Il faut en fait qu'une ligne soit insérée dans la table cocktail aveec le name et la recette et qu'une ligne soit mise par catégorie sélectionnée dans la table belong_to.
Est-ce possible de faire ceci sans nouveau POJO?
Merci
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
@Entity
@Table(name="cocktail")
public class Cocktail {
@Id
@Column(name = "id", nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column(name = "name", nullable = false, unique = true)
private String nomCocktail="";
@Column(name = "recipe", nullable = false)
private String recette="";
// relation Cocktail (many) -> Categorie (many) via une table de jointure belong_to
// belong_to(category_id) est clé étangère sur CategorieCocktail(id)
// belong_to(cocktail_id) est clé étangère sur Cocktail(id)
// cascade=CascadeType.PERSIST : persistance d'1 cocktail entraîne celle de ses categories
@ManyToMany(cascade={CascadeType.PERSIST})
@JoinTable(name="belong_to",inverseJoinColumns = @JoinColumn(name = "category_id"))
//joinColumns = @JoinColumn(name = "cocktail_id"),
private List<CategorieCocktail> categoriescocktails = new ArrayList<CategorieCocktail>();
/* constructeurs... getters setters
*/
public List<CategorieCocktail> getCategoriescocktails() {
return this.categoriescocktails;
}
public void setCategoriescocktails(List<CategorieCocktail> entrees) {
this.categoriescocktails = entrees;
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
CategorieCocktail.java
@Entity
@Table(name="cocktail_category")
public class CategorieCocktail {
@Id
@Column(name = "ID", nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column(name = "name", nullable = false)
private String nomCategorieCocktail="";
// relation Categorie (many) -> Cocktail (many) via une table de jointure belong_to
// belong_to(category_id) est clé étangère sur CategorieCocktail(id)
// belong_to(cocktail_id) est clé étangère sur Cocktail(id)
//cascade=CascadeType.PERSIST : persistance d'1 cocktail entraîne //celle de ses categories
@ManyToMany(cascade={CascadeType.PERSIST})
@JoinTable(name="belong_to",joinColumns = @JoinColumn(name = "category_id"),
inverseJoinColumns = @JoinColumn(name = "cocktail_id"))
private Set<Cocktail> cocktails = new HashSet<Cocktail>();
constructeur et getters... |