pas double emploiJPA-Hibernate: Résumé collection de classe soulève « objet référence une instance transitoire non enregistré » exception
Pour résumer la question:
J'ai une entité Order
qui a une liste de Menu
et chaque Menu
a une liste de Item
qui est une classe abstraite. Voir ci-dessous pour plus de détails.
Résumé Classe:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Item implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.TABLE,generator = "ItemIDGenerator")
@TableGenerator(table = "SEQUENCES", name = "ItemIDGenerator")
protected Long id;
//.....
}
Et mes classes concrètes:
@Entity
public class ItemA extends Item{
}
@Entity
public class ItemB extends Item{
}
@Entity
public class ItemC extends Item{
}
Les tables de ces entités concrètes existent déjà dans la base de données.
Puis:
@Entity
public class Menu implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
//one directional relation
@OneToMany(fetch = FetchType.EAGER, orphanRemoval = false)
@JoinTable(name = "menu_item", joinColumns = { @JoinColumn(name = "ID_MENU", referencedColumnName = "id") }, inverseJoinColumns = {@JoinColumn(name = "ID_ITEM", referencedColumnName = "id") })}
private List<Item> items;//problem is here
//bi-directional
@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "ID_ORDER", referencedColumnName = "id", unique = false)
private Order order;
}
Enfin:
@Entity
public class Order implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToMany(mappedBy = "order", orphanRemoval = true)
private List<Menu> menus;
}
Le problème est quand je Persit une entité Menu
Je cette exception:
object references an unsaved transient instance - save the transient instance before flushing: org.domain.project.model.Item
Le message est clair mais je ne ne voyons pas comment procéder puisque toutes les classes concrètes sont initialisées dans la base de données lorsque l'application rts Comment dire à JPA/Hibernate que toutes les sous-classes Item
sont déjà sauvegardées, il devrait donc les utiliser à la place.
Toute aide. Merci
Affichez le code dans lequel vous construisez et enregistrez un nouveau menu. –
@AlanHay même si votre commentaire est vraiment général, cela m'aide à trouver mon erreur. J'ai fait mes tests en ajoutant un nouvel item dans ma liste d'items, je ne les ai pas chargés à partir de la base de données donc leur id où 'null'! ..... Mon erreur [-_-] – akuma8
Obtient généralement ce problème lorsque obj (objet de mappage) enfant est nul – soorapadman