2010-08-27 3 views
0

J'essaie actuellement de conserver une collection en utilisant @OneToMany (cascade = CascadeType.ALL) pour une liste simple d'objets. La table pour Parent_Child est créée dans MySQL mais les clés de chaque objet ne sont pas mises à jour lors de l'utilisation de SaveOrUpdate. Une idée de ce qu'est le problème? (Ma clé parent est définie et les enfants sont générés). J'ajoute les enfants à la collection de l'objet parent avant de persister avec saveOrUpdate. J'utilise MySQL avec Hibernate 3 et ma propriété auto est définie sur create-drop.Collection OneToMany annotée non persistante via Hibernate

La classe de test:

public class Tester { 
    public static void main(String[] args) { 
     VideoChannel testChannel = new VideoChannel("Test Channel"); 
     VideoChannelMap v = new VideoChannelMap(testChannel, "Test Map"); 
     VideoSource sc2Vid = new VideoSource("starcraft-ii-ghost-of-the-past.mp4", "EinghersStreamingBucket"); 
     testChannel.add(sc2Vid); 
     Session s = HibernateSessionFactory.getSession(); 
     s.beginTransaction(); 
     s.saveOrUpdate(v); 
     s.close(); 
    }   
} 

Les entités:

@Entity 
public class VideoChannelMap { 
    @Id 
    String name; 

    @OneToMany(cascade=CascadeType.ALL) 
    List<VideoChannel> channelMap; 

    public VideoChannelMap(VideoChannel initialVid, String name) 
    { 
     this.name = name; 
     channelMap = new ArrayList<VideoChannel>(); 
     channelMap.add(initialVid); 
     initialVid.setParent(this); 
    } 
} 

@Entity 
public class VideoChannel { 

    @Id @GeneratedValue 
    Long id; 
    ... 
} 
+0

Le code actuel qui ne fonctionne pas serait extrêmement utile pour circonscrire les dizaines des causes potentielles. – Affe

Répondre

2

Vous devez vous engager réellement votre transaction. Le comportement lorsque vous fermez une session avec une transaction toujours ouverte n'est pas très bien défini et dépendra probablement de la configuration de votre base de données en dessous.

Transaction t = s.beginTransaction(); 
s.saveOrUpdate(v); 
t.commit(); 
s.close(); 

Il est évident que vous devriez également avoir une action try-catch-finally se passe là-bas pour le code « réel »;)

+0

Commettre la transaction devrait certainement aider en effet. –

Questions connexes