-->
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.  [ 4 posts ] 
Author Message
 Post subject: Fetch-Problem über drei Ebenen
PostPosted: Wed Jun 07, 2006 7:37 am 
Beginner
Beginner

Joined: Wed Jun 07, 2006 6:11 am
Posts: 20
Hibernate version: 3.1

Full stack trace of any exception that occurs:
Code:
07.06.2006 13:17:11 org.hibernate.LazyInitializationException <init>
SCHWERWIEGEND: could not initialize proxy - no Session
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
   at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:53)
   at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:98)
   at org.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:133)
   at ams.uptoip.server.user.management.model.address.UsermgrZipcode$$EnhancerByCGLIB$$46616efc.getCode(<generated>)
   at ams.uptoip.server.user.management.address.UsermgrAddressHistoryBeanTest.testGet(UsermgrAddressHistoryBeanTest.java:45)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:585)
   at junit.framework.TestCase.runTest(TestCase.java:154)
   at junit.framework.TestCase.runBare(TestCase.java:127)
   at junit.framework.TestResult$1.protect(TestResult.java:106)
   at junit.framework.TestResult.runProtected(TestResult.java:124)
   at junit.framework.TestResult.run(TestResult.java:109)
   at junit.framework.TestCase.run(TestCase.java:118)
   at junit.framework.TestSuite.runTest(TestSuite.java:208)
   at junit.framework.TestSuite.run(TestSuite.java:203)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

Name and version of the database you are using: Ingres

Problembeschreibung
Hi!

Ich habe folgende Tabellen:
Code:
CREATE TABLE usermgr_city (
    id   INTEGER     NOT NULL,
    name VARCHAR(30) NOT NULL CHECK(name <> ''),
    PRIMARY KEY(id)
);

CREATE TABLE usermgr_address (
    id      INTEGER NOT NULL,
    city    INTEGER NOT NULL
    PRIMARY KEY(id),
    FOREIGN KEY(city)    REFERENCES usermgr_city(id)
);

CREATE TABLE usermgr_address_history (
    id      INTEGER  NOT NULL,
    address INTEGER  NOT NULL,
    from    DATE     NOT NULL,
    to      DATE,     
    parent  INTEGER,
    PRIMARY KEY(id),
    FOREIGN KEY(address) REFERENCES usermgr_address(id),
    FOREIGN KEY(parent)  REFERENCES usermgr_address_history(id)
);

und ich habe folgende POJOs:
Code:
@Entity
@Table(name = "usermgr_city", schema = "ingres", uniqueConstraints = {})
public class UsermgrCity implements java.io.Serializable
{
...
  @Column(name = "name", unique = false, nullable = false, insertable = true, updatable = true, length = 30)
  public String getName()
  {
    return this.name;
  }
    ...
}  // UsermgrCity

@Entity
@Table(name = "usermgr_address", schema = "ingres", uniqueConstraints = {})
public class UsermgrAddress implements java.io.Serializable
{
    ...
  @ManyToOne(cascade = {}, fetch = FetchType.LAZY)
  @JoinColumn(name = "city", unique = false, nullable = false, insertable = true, updatable = true)
  public UsermgrCity getUsermgrCity()
  {
    return this.usermgrCity;
  }
    ...
}  // UsermgrAddress

@Entity
@Table(name = "usermgr_address_history", schema = "ingres", uniqueConstraints = {})
public class UsermgrAddressHistory implements java.io.Serializable
{
    ...
  @ManyToOne(cascade = {}, fetch = FetchType.LAZY)
  @JoinColumn(name = "address", unique = false, nullable = false, insertable = true, updatable = true)
  public UsermgrAddress getUsermgrAddress()
  {
    return this.usermgrAddress;
  }
    ...
}  // UsermgrAddressHistory


Die Klasse UsermgrAddress besteht jeden Test einwandfrei, nur wenn ich folgenden Code ausführen möchte, bekomme ich oben angeführte Fehlermeldung:

addressHistory.getId(); // Funktioniert
addressHistory.getFrom(); // Funktioniert
UsermgrAddress address = addressHistory.getUsermgrAddress(); // Funktioniert
address.getId() == 1; // Funktioniert
address.getUsermgrCity().getName().equals(CITY); // FEHLER

Meine Frage nun:
Wie kann ich andere Objekte hinzufetchen (nicht alle so wie bei EAGER, sondern nur ausgewählte). Oder muss ich EAGER verwenden?

Danke!


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jun 07, 2006 10:11 am 
Beginner
Beginner

Joined: Fri May 19, 2006 11:34 am
Posts: 29
Hallo Christian,

das ist ein Problem des Lazy-Loadings.

Während du ein Objekt von usermng_address_history lädst, wird nur der Schlüssel auf die City mitgeladen. Danach wird bei dir die Session geschlossen. Du kannst dann natürlich auf die Attribute der History zugreifen.

Sobald du aber ein Objekt City nachladen willst, um an das entsprechende Attribut für den Verglaich zugreifen willst, muss dies erst nachgeladen werden. Funktioniert jedoch bei einer geschlossenen Session nicht mehr.

Alternativ kannst du via der Option lazy="false" ein Nachladen verhindern, da das Objekt City beim Laden der History gleich geladen wird.

Da die komplette Methode fehlt, kann ich dir da jetzt auch keine weiteren Anhaltspunkte liefern.

Viele Grüsse
Kai


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jun 07, 2006 10:21 am 
Beginner
Beginner

Joined: Wed Jun 07, 2006 6:11 am
Posts: 20
Hi Kai!

Danke für deine schnelle Antwort!

Das Lazy-Fetching ist für mich generell ein Problem. Ich habe derzeit bei der Methode getUsermgrAddress den FetchType auf EAGER umgestellt und auch bei der Methode getUsermgrCity. Nun funktioniert es. Weiters habe ich die max_fetch_depth auf 3 gesetzt.
Nur das mit dem EAGER finde ich nicht so gut ...

Welche Methoden brauchst du genau um mir noch ein paar Tipps geben zu können?

Grüße, Christian


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jun 07, 2006 12:02 pm 
Beginner
Beginner

Joined: Fri May 19, 2006 11:34 am
Posts: 29
Das mit dem Eager laden kann wirklich zu einem Performance-Problem führen. Nämlich dann, wenn du ein Objekt eager nachlädst, dieses selbst dann andere Objekte nachlädt etc. pp.

Solange du address.getUsermgrCity().getName() innerhalb der selben Session durchführst, wo address initialisiert wird, sollte alles passen.

Viele Grüsse
Kai


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

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.