-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 
Author Message
 Post subject: cascade bidirektionale OneToMany Assoziation
PostPosted: Fri Feb 29, 2008 4:13 am 
Newbie

Joined: Fri Feb 29, 2008 3:37 am
Posts: 3
Hibernate version: 3.3

Hallo Zusammen,
zwischen zwei Objekten habe ich eine bidirektionale 1-n-Beziehung, nun möchte ich erreichen, dass ich mit einem Befehl gleichzeitig beide Seite aktualisiere. Die Many-Seite halte ich auf der One Seite in einer Collection (in meinem Fall eine List). Den Setter der List habe ich private gemacht, damit die add- und remove-Methode genutzt wird.

Code:
@OneToMany(mappedBy="regelMeineFormel1")
   @Cascade(CascadeType.MERGE)
   public List<Regel> getFormel1MeineRegeln() {
      return mFormel1MeineRegeln;
   }
   @SuppressWarnings("unused")
   private void setFormel1MeineRegeln(List<Regel> prmFormel1MeineRegeln) {
      mFormel1MeineRegeln = prmFormel1MeineRegeln;
   }
   public void addFormel1MeineRegel(Regel prmRegel){
      prmRegel.setRegelMeineFormel1(this);
      mFormel1MeineRegeln.add(prmRegel);
   }
   public void removeFormel1MeineRegel(Regel prmRegel){
      mFormel1MeineRegeln.remove(prmRegel);
      prmRegel.setRegelMeineFormel1(null);
   }


Wenn ich nun innerhalb einer Transaktion die Änderungen auf beiden Seiten sehen möchte, funktioniert dies beim Add, wenn ich wie oben gezeigt CascadeType.MERGE nutze. Egal welches Objekt ich speichere, die andere Seite bekommt es mit. Wenn ich aber remove', dann bekommt die andere Seite dies nur mit, wenn ich die Many-Seite speichere. Meine Vermutung, dass ich auf einer Seite zusätzlich mit CascadeType.REMOVE arbeiten muss, hat sich nicht bestätigt.

Code:
//regel2.setBezeichnung("NEU_NEU_NEU");
formel2.removeFormel1MeineRegel(regel2);
      
transactionTemplate.execute(new TransactionCallback(){
public Object doInTransaction(TransactionStatus prmStatus){
   try {
      mFormelDao.save(formel2);
//      mRegelDao.save(regel2);
      regel1 = mRegelDao.getById(2L, true, false, false);
   } catch (ObjectNotFoundException e) {
      e.printStackTrace();
   }
   assertNull(regel1.getRegelMeineFormel1());return null;
}
});


In diesem TestCase trenne ich die Beziehung zwischen regel2 und formel2, danach speichere ich die formel2 innerhalb einer Transaktion. Direkt folgend lese ich das RegelObjekt wieder als regel1 ein. Im oben gezeigten code bekomme ich aber eine AssertionError.
Wenn ich anstelle der formel, die regel speichere, dann funktioniert mein TestCase. Er funktioniert auch, wenn die irgendeine Änderung an der regel mache, dann ist es egal welche Seite ich speichere.

In Gavin King's JAVA PERSISTENCE with HIBERNATE ist er sehr sparsam mit Beschreibungen zu bidirektionalen Assoziationen. Hier wird an verschiedenen Stellen darauf hingewiesen, dass mit CascadeType.SAVE_UPDATE der gewünschte Effekt zu erzielen sei. Dies kann ich nicht bestätigen, ich bekomme beim add'en mit SAVE_UPDATE keinen Effekt, nur MERGE hilft beim add'en.

Hat jemand eine Idee?
Gruß
Andreas


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.