2017-10-10 2 views
0

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

+1

Affichez le code dans lequel vous construisez et enregistrez un nouveau menu. –

+0

@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

+0

Obtient généralement ce problème lorsque obj (objet de mappage) enfant est nul – soorapadman

Répondre

0

Vous devrez peut-être utiliser une relation plusieurs-à-plusieurs, cela permettra également plus de flexibilité si vous souhaitez supprimer des éléments d'un menu mais pas de tous les menus.

Menu < -> MenuItem < -> Article

La nouvelle entité aura MenuItem clés primaires pour les menu et le point.

Many to Many example

+0

Mes instances enfants (sous-classes) sont déjà persistées. Donc je ne veux pas les persister encore. Je veux juste persister un 'Menu' sans cascade car ils existent déjà. – akuma8