grundsätzlich hab ich folgendes vor.. ganz simple master detail ansichten.... ich hab ein sehr komplexes objekt, eine berstellung, ich zeige alle bestellungen in einem jtable an, klickt der benutzer auf eine zeile wird ein detail formular gefüllt. Das detail benötigt aber viel mehr daten, kunden, bestellte artikel usw.. die bestellung verweißt auf diese objekte... eager loading lädt alles brav mit, aus performance gründen will ich aber lazy nachladen...
aber wie mach ich das, ich lade eine liste mit den bestellungen und stell sie in der table dar, klickt der benutzer auf eine bstellung greif ich auf die objekte in meiner bestellung zu.. klar LazyInitializationException... jetzt hab ich mir gedacht ich lade das eine objekt neu.. öffne eine session und greif auf alle elemente zu dich ich später brauche... klappt aber das ist doch nicht sinn der sache, wie mach ich sowas normalerweise.... session die ganze zeit offen lassen?
ich lade ungefähr so...
geht das irgendwie eleganter?
ok das war mein erstes problem.
dann mein zweites... ich speicher meine Bestellungen über den merge befehl...
ich hab ein paar versandarten, verkäufer usw.. diese lade ich, ich lade eine orderobjekt, das zufällig schon die selbe versandart gesetzt hat, ich speicher die order mit
bekomm ich fehler..
also zu meinem problem ich hab zb bestellte produkte als list in der order
wenn ich nun einen artikel lösche und mit merge die order speicher, bleibt der artikel noch immer in der datenbank... muss ich den artikel seperat löschen.. schaft mir das nicht das CascadeType.ALL wie mach ich das am besten?
kann sein dass das ein wenig verwirrend ist, aber ich hab heute schon 6 bier getrunken ;-)
aber wie mach ich das, ich lade eine liste mit den bestellungen und stell sie in der table dar, klickt der benutzer auf eine bstellung greif ich auf die objekte in meiner bestellung zu.. klar LazyInitializationException... jetzt hab ich mir gedacht ich lade das eine objekt neu.. öffne eine session und greif auf alle elemente zu dich ich später brauche... klappt aber das ist doch nicht sinn der sache, wie mach ich sowas normalerweise.... session die ganze zeit offen lassen?
ich lade ungefähr so...
Code:
public class OrderDao extends HibernateDaoSupport implements IOrderDao {
...
//alle orders
public List<Order> getOrders() {
List<Order> result = (List<Order>) getHibernateTemplate().find("from Order");
return result;
}
...
public Order getOrderById(Integer id) {
Session session = getHibernateTemplate().getSessionFactory().openSession();
session.beginTransaction();
Order o = (Order) session.load(Order.class, id);
if(o.getOrderedProducts().size()>0)
o.getOrderedProducts().get(o.getOrderedProducts().size()-1);
if(o.getOrderHistory().size()>0)
o.getOrderHistory().get(o.getOrderHistory().size()-1);
o.getDelivery().getFirstname();
o.getShipping().getShippingPartner();
o.getPayment().getPaymentInfo();
session.close();
return o;
}
..
}
geht das irgendwie eleganter?
ok das war mein erstes problem.
dann mein zweites... ich speicher meine Bestellungen über den merge befehl...
Code:
getHibernateTemplate().merge(o);
Code:
getHibernateTemplate().saveOrUpdate(o);
mhn mit merge passiert das nicht... funtioniert soweit allesa different object with the same identifier value was already associated with the session:
also zu meinem problem ich hab zb bestellte produkte als list in der order
Code:
@OneToMany(mappedBy = "order", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
public List<OrderedProduct> getOrderedProducts() {
return orderedProducts;
}
kann sein dass das ein wenig verwirrend ist, aber ich hab heute schon 6 bier getrunken ;-)