hibernate probleme

Status
Nicht offen für weitere Antworten.

ARadauer

Top Contributor
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...
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);
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
Code:
    getHibernateTemplate().saveOrUpdate(o);
bekomm ich fehler..
a different object with the same identifier value was already associated with the session:
mhn mit merge passiert das nicht... funtioniert soweit alles
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;
}
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 ;-)
 

ARadauer

Top Contributor
aja in meinem Ordered Product hab ich einen Verweis auf die Order

Code:
@ManyToOne
	@JoinColumn(name= "order_fk")
	public Order getOrder() {
		return order;
	}
 

semi

Top Contributor
Das erste würde ich in eine NamedQuery auslagern, statt jedes mal die Sachen nachzuladen.
z.B.
Code:
@NamedQueries( {
   @NamedQuery(
      name = Order.FETCHDETAILS,
     query = "select o"
           + "  from Order o"
           + "       join fetch o.orderProducts"
           + "       join fetch o.orderHistory"
           + "       join fetch o.shipping s"
           + "       join fetch s.shippingPartner"
           + "       join fetch o.payment p"
           + "       join fetch p.paymentInfo"
           + " where o.id = :orderId"
   )
})
...
public class Order ...
{
   /**
   * Liefert eine Bestellung mit allen dazugehörigen Details.
   *
   * Parameter
   *   orderId: Id der Bestellung
   */
   public static final String FETCHDETAILS = "Order.FetchDetails";

   ...
}

Session session = ...
Query query = session.getNamedQuery(Order.FETCHDETAILS);
query.setParameter("orderId", id);
Order order = (Order)query.getSingleResult();
...

Deine Fragen zu der Session und dem Cascade lassen sich nicht beantworten, ohne zu wissen,
wie deine Anwendung aufgebaut ist. Speziell klingt es so, als ob du tatsächlich die Entities, wie
sie sind, bis zum Client schleifen würdest.
 

ARadauer

Top Contributor
Deine Fragen zu der Session und dem Cascade lassen sich nicht beantworten, ohne zu wissen,
wie deine Anwendung aufgebaut ist.
mhn also grob eine order und orderedproducts...
so sehen die annotions aus

oder:
Code:
	@OneToMany(mappedBy = "order", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
	public List<OrderedProduct> getOrderedProducts() {
		return orderedProducts;
	}

beim product hab ich noch einen verweis auf die order

Code:
@ManyToOne
	@JoinColumn(name= "order_fk")
	public Order getOrder() {
		return order;
	}

ich möchte das ordered product über remove aus der list von order entfernne können und das irgendwie persistieren, anscheinend reicht ein merge der order nicht....

das mit der NamedQuery hört sich gut an... danke
 

semi

Top Contributor
Ich meinte eher die grobe Architektur. Ist es eine Web-Anwendung, eine Desktop-Anwendung, irgendeine
Client/Server-Anwendung etc.?
Wenn es auf einem Application Server läuft, würde ich dir empfehlen ganz normal einen EntityManager zu
verwenden, statt die Sessions von Hibernate direkt zu verwenden. Einfach direkt JPA, wo es geht, und nur
in Ausnahmefällen Hibernate-spezifische Features einstreuen, wo es sich nicht vermeiden lässt.
 

ARadauer

Top Contributor
es ist eine swing desktop anwendung, im moment nur 2 tier, also vom desktop direkt in die db, ich verwende einen hirachischen mvc ansatz mit einer service schicht von der aus meine model klassen über daos auf die db zugreifen. in den daos verwende ich spring und hibernate.
 

ARadauer

Top Contributor
ich fass glaub ich meine frage zusammen:

kann ich bei einer bidirektionalen OneToMany beziehung zb eine bestellung hat mehrer produkte, einfach ein produkt aus der list der bestellung löschen, dann die bestellung speichern und das produkt soll gelöscht werden... geht das?

oder muss ich vorher das produkt löschen, was ich jetzt gemacht habe, ist aber nicht nach meinem sinn, ich will die order speichern und das produkt soll gelöscht werden...
 

byte

Top Contributor
Also wegen der Lazy / Eager Geschichte:

Die Properties vorzuladen, indem Du die Getter aufrufst, ist keine tolle Idee. Die Properties werden dann per SELECT nachgeladen. Besser ist die Lösung von semi mit NamedQuery. Oder halt einfach ein spezifisches HQL oder Criteria bauen und die Properties per JOIN mitladen, die Du benötigst.


Was das zweite Problem angeht:

merge() lädt zunächst die Entität in die Session. Offenbar hast Du Deine Session nicht geschlossen, so dass noch ein älteres Objekt an die Session gebunden ist, so dass es beim saveOrUpdate() knallt?
 

semi

Top Contributor
ARadauer hat gesagt.:
kann ich bei einer bidirektionalen OneToMany beziehung zb eine bestellung hat mehrer produkte, einfach ein produkt aus der list der bestellung löschen, dann die bestellung speichern und das produkt soll gelöscht werden... geht das?
So viel ich weiss, nein. Vielleicht mit den Annotationen von Hibernate, aber mit den Annotationen aus
javax.persistence nicht. Grundsätzlich ist man für die Relationships selbst zuständig.

ARadauer hat gesagt.:
oder muss ich vorher das produkt löschen, was ich jetzt gemacht habe, ist aber nicht nach meinem sinn, ich will die order speichern und das produkt soll gelöscht werden...
Du kannst das Produkt löschen, ohne es aus der Collection in Order zu entfernen (OK, nicht das, was du willst).
Das sollte funktionieren und wird mit Order synchronisiert.

Die Session für die gesamte Laufzeit der Anwendung offen zu halten sollte funktionieren, erfordert aber etwas Disziplin
beim Umgang mit den Entities. Ein Problem, das du haben wirst, ist das Rückgängig machen von Änderungen
in der GUI und (versehentliches) Laden mehrere Instanzen in die Session. Wenn du z.B. eine Order und die
dazugehörigen Produkte anzeigst und die Möglichkeit anbietest einzelne Produkte zu löschen und diese direkt
aus der Collection entfernst. Da gibt es viel Raum für Fehler. Ich würde in diesem Fall eher zu VOs tendieren,
um eine Manipulation an den Daten zu ermöglichen, ohne mir Gedanken über die Entities zu machen.
Das erfordert wieder eine Mapping-Schicht in deinen DAOs. Die DAOs würde ich aber sowieso etwas erweitern,
um die Sessions und Transaktionen nicht jedes mal, in jeder Methode, getrennt verwalten zu müssen.
(Stichwort: Factory für DAOs und darin einen Proxy mit Session- und Transaktions- und Exceptionhandling
instanziiieren)

Um Produkte zum Löschen zu markieren könntest du auch folgendes tun, ist aber nicht so sexy.
Code:
class Product {
   ...
   @Transient
   private boolean deleted;
   ...
}
Dann die Liste der Produkte durchgehen und alle mit deleted == true entfernen, wenn der Anwender
auf Speichern geklickt hat.

Machst du die Updates an Produkten und an Order in modalen Dialogen, wo es auch die Möglichkeit gibt die
Änderungen zu verwerfen? Wenn ja, dann kommst du um VOs bzw. ein Model für die GUI nicht herum.
 

byte

Top Contributor
semi hat gesagt.:
ARadauer hat gesagt.:
kann ich bei einer bidirektionalen OneToMany beziehung zb eine bestellung hat mehrer produkte, einfach ein produkt aus der list der bestellung löschen, dann die bestellung speichern und das produkt soll gelöscht werden... geht das?
So viel ich weiss, nein. Vielleicht mit den Annotationen von Hibernate, aber mit den Annotationen aus javax.persistence nicht. Grundsätzlich ist man für die Relationships selbst zuständig.
Das geht in der Tat nur mit Hibernate. Guck Dir mal CascadeType.DELETE_ORPHAN an.
 

semi

Top Contributor
@byto
:toll: Genau das.
Code:
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
@org.hibernate.annotations.Cascade(
   value = org.hibernate.annotations.CascadeType.DELETE_ORPHAN
)
public List<OrderedProduct> getOrderedProducts() {
   return orderedProducts;
}
 

ARadauer

Top Contributor
super leute!!!

CascadeType.DELETE_ORPHAN und das NamedQuery von maki, genau das was ich gesucht habe... funktioniert super!

danke
 

ARadauer

Top Contributor
ich glaub es ist sinnvoll wenn ich mir mal ein gutes hibernte buch rein ziehe...

kann mir jemand eines empfehlen
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Probleme mit meinem 1. Hibernate Beispiel Datenbankprogrammierung 3
J MySQL Hibernate: Probleme beim Speichern von OneToMany - Datensätzen Datenbankprogrammierung 2
P Hibernate -> Probleme bei n:m-Relation und JUnit Datenbankprogrammierung 10
klattiator Hibernate - Probleme bei Konfiguration Datenbankprogrammierung 3
F Probleme mit entfernter DB und Hibernate Zeichensatz Datenbankprogrammierung 3
krgewb Hibernate: Fremdschlüssel wird nicht erzeugt Datenbankprogrammierung 2
torresbig MySQL hibernate - could not resolve entity class ... (Datenbank Anfänger) Datenbankprogrammierung 19
I Hibernate Predicate mit IN Clause "Unaware how to convert value to requested type" Datenbankprogrammierung 0
T org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: ..., could not initialize proxy - no Session Datenbankprogrammierung 5
T Realisierungsvorschläge Hibernate SQL Datenbankprogrammierung 1
Zrebna Wie mittels Hibernate eine Join-Tabelle als eigene Java-Klasse erstellen? Datenbankprogrammierung 5
Zrebna Tabellen-Erzeugung via Hibernate ignoriert 'CascadeType' settings Datenbankprogrammierung 1
I Hibernate / JPA - Spaltenname von Query (Select) bekommen Datenbankprogrammierung 6
M Mysql Views und Hibernate Caching Datenbankprogrammierung 4
damike84 Hibernate: persistieren eines Graphen Datenbankprogrammierung 2
N Hibernate Entitäten bei Selects aus 2 Tabellen Datenbankprogrammierung 7
OnDemand Hibernate Realationen Datenbankprogrammierung 7
OnDemand Hibernate ManyToOne Datenbankprogrammierung 5
D Hibernate oneToMany Syntaxfehler Datenbankprogrammierung 3
D Hibernate Error: NoSuchMethodError Datenbankprogrammierung 4
D hibernate mit postgreSQL Datenbankprogrammierung 3
S MySQL Hibernate: Fehler bei Verwendung von 2 unterschiedlichen Enumration Datenbankprogrammierung 3
F Problem mit Hibernate c3p0 Datenbankprogrammierung 2
OnDemand MySQL Trigger löst nicht aus bei Hibernate Update Datenbankprogrammierung 12
OnDemand Hibernate OneToMany ManyToOne Datenbankprogrammierung 61
J Hibernate One-To-One mit Where Klausel Datenbankprogrammierung 6
L hibernate.cfg.xml Could not parse configuration Datenbankprogrammierung 0
L H2 Hibernate definieren? Datenbankprogrammierung 1
T JPA Mapping Enum (hibernate 5) Datenbankprogrammierung 1
H In hibernate.cfg.xml schreiben und auslesen Datenbankprogrammierung 0
K Hibernate: Ein Fluch Datenbankprogrammierung 3
K Java Object mit Hibernate in MySQL abspeichern Datenbankprogrammierung 1
K Eclipse: JBoss Hibernate Tool: Kein Zugriff auf Datenbank Datenbankprogrammierung 5
S JpaRepositories & Hibernate: ungewolltes trim() in findBy Datenbankprogrammierung 7
S MySQL hibernate exception: illegal state exception : entityManagerFactory is closed Datenbankprogrammierung 5
S Hibernate: Verschiedene Klassen zurückgeben. Datenbankprogrammierung 2
looparda Architektur für JPA Hibernate Umstieg Datenbankprogrammierung 14
O HSQLDB Hibernate Criteria Problem Datenbankprogrammierung 3
perlenfischer1984 Hibernate mit final members Datenbankprogrammierung 3
perlenfischer1984 Java Objecte speichern mit Hibernate ? Datenbankprogrammierung 2
N SQLite Hibernate und Aufruf von Funktion SELECT last_insert_rowid() Datenbankprogrammierung 2
N Sqlite3 und Hibernate Datenbankprogrammierung 3
A Hibernate Cache leeren Datenbankprogrammierung 4
I MySQL Hibernate zu viele Queries Datenbankprogrammierung 2
Psypsy Hibernate / JPA erkennen von schon gespeicherten Objekten Datenbankprogrammierung 4
Psypsy Hibernate / JPA OneToOne MappedBy Frage Datenbankprogrammierung 2
J Hibernate + DTOs - DTOs in DAOs verwenden? Datenbankprogrammierung 1
S Hibernate-Konfiguration : Unverständliche Ausgabe beim Ausführen Datenbankprogrammierung 0
I MySQL Hibernate / MySQL alias in WHERE clause Datenbankprogrammierung 1
J Hibernate + HSQL embedded Datenbankprogrammierung 2
P Hibernate Einstieg Datenbankprogrammierung 5
C Hibernate und createQuery Datenbankprogrammierung 2
V kennt jemand empfehlenswerte online tutorials zur Hibernate ? gerne auch englisch. Datenbankprogrammierung 4
G H2 Hibernate - wie joins machen Datenbankprogrammierung 1
D Hibernate: Zustand eines Objekts erkennen? Datenbankprogrammierung 0
D Unterschiede Hibernate Vs. Java Persistence API Datenbankprogrammierung 8
I Hibernate / JPA Index hinzufügen Datenbankprogrammierung 1
X Hibernate Cache Verständnisproblem Datenbankprogrammierung 0
T Hibernate und inner class Datenbankprogrammierung 0
K n:m Tabellen mit Hibernate erstellen Datenbankprogrammierung 1
T Hibernate DAO gute Tutorials/Bücher gesucht Datenbankprogrammierung 0
C Hibernate: could not resolve property Datenbankprogrammierung 1
J Plug-In-Framework für Hibernate-Klassen Datenbankprogrammierung 0
M Hibernate - Save Child wenn nötig Datenbankprogrammierung 10
M DAO's + Hibernate Theorie Datenbankprogrammierung 4
T Hibernate, HSQLDB und UNIQUE Datenbankprogrammierung 2
F Hibernate - verschiedene Schemen Datenbankprogrammierung 7
D Hibernate SaveOrUpdate Exception Datenbankprogrammierung 2
D Hibernate CreateQuery ohne Result Datenbankprogrammierung 7
E MySQL Hibernate mit JaxWS führt zu LazyInitialization Exception Datenbankprogrammierung 8
L Einarbeitung in Hibernate -> wenn gute SQL Kenntnisse vorhanden? Datenbankprogrammierung 2
B DB2 Hibernate findet Datenbank nicht Datenbankprogrammierung 18
K JPA / Hibernate Annotations Datenbankprogrammierung 4
M JPA / Hibernate mit Postgres DB Datenbankprogrammierung 3
P JSF + H2 + TomEE + Hibernate/JPA Datenbank wird nicht angelegt Datenbankprogrammierung 3
E MySQL Hibernate ( Anfänger ) Datenbankprogrammierung 3
P Lazy-Fetchig und Session-Problem mit Hibernate Datenbankprogrammierung 4
J Hibernate Select auf Parameterliste Datenbankprogrammierung 3
C Hibernate ManyToMany zusammengesetzter Primärschlüssel, problem. Datenbankprogrammierung 3
P Oracle Hibernate - Oracle-VarChar-Index wird nicht genutzt Datenbankprogrammierung 3
M Hibernate Foreign Key definieren Datenbankprogrammierung 4
M Abstrakte Klassen Hibernate Datenbankprogrammierung 4
D Mit Hibernate (mit Annotation) auf Views zugreifen Datenbankprogrammierung 2
M [Hibernate]Abgleich eines lokalen Objekts mit dem Zustand aus der Datenbank. Datenbankprogrammierung 3
P Mit Hibernate mehrere Datensätze löschen Datenbankprogrammierung 7
P erste Schritte mit Hibernate Datenbankprogrammierung 3
V Hibernate Interfaces von anderem Projekt Datenbankprogrammierung 2
J MySQL Datenbank konfigurieren, JDBC, MySQL oder Hibernate Datenbankprogrammierung 2
B Hibernate und portierbare Datenbank Datenbankprogrammierung 3
qwerqer [Hibernate] Mappingvarianten Datenbankprogrammierung 2
lumo Teneo Hibernate & JPA Datenbankprogrammierung 15
Z JPA mit Hibernate - Unable to build EntityManagerFactory Datenbankprogrammierung 7
Dit_ Hibernate, effiziente SQL-Abfrage definieren Datenbankprogrammierung 5
K Hibernate vs. JDBC Datenbankprogrammierung 4
J Hibernate Info 593 ? Datenbankprogrammierung 4
J Erstellen der SessionFactory in Hibernate 4.1 Datenbankprogrammierung 2
L PostgreSQL Hibernate-Frage Datenbankprogrammierung 2
X MySQL Hibernate: Massenupdate auf unbekannte Tabelle Datenbankprogrammierung 4
N hibernate: datasource Datenbankprogrammierung 7
H MySQL Hibernate: Updaten vereinfachen Datenbankprogrammierung 2

Ähnliche Java Themen


Oben