2012-03-29 8 views
1

Wenn ich eine Hibernate merge() zu einem ItemVersionLanguage-Objekt mache, bekam ich "ERROR [org.hibernate.LazyInitializationException] (pool-9-thread-1) konnte Proxy nicht initialisieren - keine Session: org .hibernate.LazyInitializationException: Proxy konnte nicht initialisiert werden - keine Sitzung "aus den folgenden Codes.LazyInitializationException in Hibernate Entity Getter

Aber wenn ich Daten davon erhalte, funktioniert es entweder von ItemVersion oder ItemVersionLanguage URL.

Ich habe keine @Transactional den Code einwickeln, in dem merge() sucht.

ItemVersionLanguage.java

@Entity 
@Table(name = "item_version_language") 
public class ItemVersionLanguage implements java.io.Serializable { 
    private String url; 
    private ItemVersion itemVersion; 

    public void setUrl(String url) 
    { 
     this.url = url; 
    } 
    @Column(name = "url") 
    public String getUrl() 
    { 
     if(this.url == null) 
     { 
      return this.itemVersion.url; //this results in the problem! 
     } 
     else 
     { 
      return this.url; 
     } 
    } 
    public void setItemVersion(ItemVersion itemVersion) 
    { 
     this.itemVersion = itemVersion; 
    } 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "item_version_obj_id", nullable = false) 
    public ItemVersion getItemVersion() 
    { 
     return this.itemVersion; 
    } 
} 

ItemVersion.java

@Entity 
@Table(name = "item_version") 
public class ItemVersion implements java.io.Serializable { 
    private String url; 

    public void setUrl(String url) 
    { 
     this.url = url; 
    } 
    @Column(name = "url") 
    public String getUrl() 
    { 
     return this.url; 
    } 
} 

Bin ich etwas falsch gemacht?

Antwort

1

Die Lazy-Initialisierung ermöglicht es der Variablen, als Proxy zu fungieren, der seinen Wert nach Bedarf abrufen kann. Dieser Fehler tritt auf, wenn Code versucht, aus der Variablen zu lesen, nachdem die Sitzung, die die Entität abgerufen hat, geschlossen wurde. Dadurch kann der Proxy den Wert nicht mehr abrufen.

Sie können Hibernate.initialize (itemVersionLanguage.getItemVersion()) verwenden, um den Wert des Proxys vor dem Schließen der Sitzung zu laden.

Weitere Details finden Sie unter http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/performance.html#performance-fetching-initialization.

Verwandte Themen