2012-04-11 2 views
1

Ich habe einige Probleme, eine größere Anwendung mit vielen Tabellenbeziehungen zu bekommen, die mit Struts2 und Hibernate arbeiten, also entschied ich mich, ein viel kleineres Beispiel zu erstellen und ich kann das auch nicht funktionieren. Mein Hauptproblem ist, dass ich die beiden überhaupt nicht dazu bringen kann zusammenzuarbeiten, wenn es irgendwelche faulen Instanziierungssätze gibt. Ich versuche herauszufinden, wie man es mit und ohne Laden der faulen Daten arbeiten lassen kann, aber in diesem Fall habe ich die faulen Daten geladen und bekomme einen "java.lang.StackOverflowError". Ich habe zwei Tabellen, "Abteilungen", mit zwei Einträgen und "Mitarbeiter", mit drei; Ich verwende den Struts2 "xslt" Ergebnistyp. Hier sind die beiden Ausdauer Klassen:Fehler beim Versuch, ein einfaches Struts2 w/Hibernate-Beispiel zu erhalten

Abteilungen:

package com.test.model; 
// Generated Apr 7, 2012 7:10:28 PM by Hibernate Tools 3.4.0.CR1 

import java.util.HashSet; 
import java.util.Set; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.GeneratedValue; 
import static javax.persistence.GenerationType.IDENTITY; 
import javax.persistence.Id; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 

/** 
* Departments generated by hbm2java 
*/ 
@Entity 
@Table(name="Departments" 
    ,catalog="test" 
) 
public class Departments implements java.io.Serializable { 


    private Integer id; 
    private String name; 
    private Set<Employees> employeeses = new HashSet(0); 

    public Departments() { 
    } 


    public Departments(String name) { 
     this.name = name; 
    } 
    public Departments(String name, Set employeeses) { 
     this.name = name; 
     this.employeeses = employeeses; 
    } 

    @Id @GeneratedValue(strategy=IDENTITY) 


    @Column(name="Id", unique=true, nullable=false) 
    public Integer getId() { 
     return this.id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 


    @Column(name="Name", nullable=false) 
    public String getName() { 
     return this.name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @OneToMany(fetch=FetchType.LAZY, mappedBy="departments") 
    public Set<Employees> getEmployeeses() { 
     return this.employeeses; 
    } 

    public void setEmployeeses(Set employeeses) { 
     this.employeeses = employeeses; 
    } 
} 

Mitarbeiter:

package com.test.model; 
// Generated Apr 7, 2012 7:10:28 PM by Hibernate Tools 3.4.0.CR1 


import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.GeneratedValue; 
import static javax.persistence.GenerationType.IDENTITY; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 
import javax.persistence.Table; 

/** 
* Employees generated by hbm2java 
*/ 
@Entity 
@Table(name="Employees" 
    ,catalog="test" 
) 
public class Employees implements java.io.Serializable { 


    private Integer id; 
    private Departments departments; 
    private String firstName; 
    private String lastName; 

    public Employees() { 
    } 

    public Employees(Departments departments, String firstName, String lastName) { 
     this.departments = departments; 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

    @Id @GeneratedValue(strategy=IDENTITY) 


    @Column(name="Id", unique=true, nullable=false) 
    public Integer getId() { 
     return this.id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="DepartmentsId", nullable=false) 
    public Departments getDepartments() { 
     return this.departments; 
    } 

    public void setDepartments(Departments departments) { 
     this.departments = departments; 
    } 


    @Column(name="FirstName", nullable=false) 
    public String getFirstName() { 
     return this.firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 


    @Column(name="LastName", nullable=false) 
    public String getLastName() { 
     return this.lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 
} 

Die HQL Abfrage ich in der DepartmentsManager Klasse bin mit ist: „von Abteilungen links d join d holen. Mitarbeiter ".

Hier ist die Stacktrace des Fehlers:

Exception in thread "http-bio-8080-exec-4" java.lang.StackOverflowError at java.security.AccessController.doPrivileged(Native Method) at org.apache.commons.logging.LogFactory.getContextClassLoaderInternal(LogFactory.java:859) at org.apache.commons.logging.LogFactory.getFactory(LogFactory.java:423) at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:685) at com.opensymphony.xwork2.util.logging.commons.CommonsLoggerFactory.getLoggerImpl(CommonsLoggerFactory.java:29) at com.opensymphony.xwork2.util.logging.LoggerFactory.getLogger(LoggerFactory.java:42) at org.apache.struts2.views.xslt.AbstractAdapterNode.(AbstractAdapterNode.java:85) at org.apache.struts2.views.xslt.AbstractAdapterElement.(AbstractAdapterElement.java:41) at org.apache.struts2.views.xslt.BeanAdapter.(BeanAdapter.java:73) at sun.reflect.GeneratedConstructorAccessor14.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:525) at java.lang.Class.newInstance0(Class.java:372) at java.lang.Class.newInstance(Class.java:325) at org.apache.struts2.views.xslt.AdapterFactory.constructAdapterInstance(AdapterFactory.java:209) at org.apache.struts2.views.xslt.AdapterFactory.adaptNode(AdapterFactory.java:159) at org.apache.struts2.views.xslt.BeanAdapter.buildChildAdapters(BeanAdapter.java:135) at org.apache.struts2.views.xslt.AbstractAdapterNode.getChildAdapters(AbstractAdapterNode.java:128) at org.apache.struts2.views.xslt.AbstractAdapterNode.getChildNodes(AbstractAdapterNode.java:186) at org.apache.struts2.views.xslt.BeanAdapter.getChildNodes(BeanAdapter.java:88) at org.apache.struts2.views.xslt.AbstractAdapterNode.getFirstChild(AbstractAdapterNode.java:194) at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2SAX.parse(DOM2SAX.java:300) at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2SAX.parse(DOM2SAX.java:302)...[this line repeats ad nauseam]

Würde bitte jemand mich in die richtige Richtung?

Danke!

Antwort

1

Ja, hier ist ein Gedanke:

Sie haben eine Departments Klasse (schlechte Namensgebung - die einzigartige Abteilung verwenden). Es verfügt über eine Reihe von Employee-Instanzen. Es ist eine Eins-zu-Viele-Beziehung: Eine Abteilung kann einen oder mehrere Mitarbeiter haben. So weit, ist es gut.

Ihre Mitarbeiter-Klasse (mehr schlechte Benennung - verwenden Sie den Singular-Mitarbeiter) hat einen Verweis auf seine übergeordneten Abteilung.

Sie sehen das Problem? Jedes Mal, wenn Sie den Employee-Konstruktor aufrufen, können Sie den Department-Konstruktor aufrufen, der einen Satz von Mitarbeitern erstellt. Die Instanz des ursprünglichen Mitarbeiters befindet sich in diesem Set, das wiederum den Department-Konstruktor ad nauseum aufruft.

Sie müssen den Zyklus brechen: es ist eine bidirektionale One-to-many ist:

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/example-parentchild.html#example-parentchild-bidir

+0

Das sehr viel Sinn macht! Wenn ich das "Departments" -Objekt von "Employees" entferne, bekomme ich genau das, was ich will! Verliere ich jedoch einige Funktionen, bei denen "Mitarbeiter" nicht auf "Abteilungen" zurückgesetzt wurden? Wenn ja, gibt es einen besseren Weg (wie durch eine Anmerkung)? Vielen Dank! –

+0

Schauen Sie sich die Hibernate-Dokumente an, die ich Ihnen gesendet habe. Sie haben einen Abschnitt darüber, wie bidirektionale Eins-zu-Viele-Operationen richtig durchgeführt werden können. Lesen Sie es und sehen Sie, ob Sie etwas Wichtiges verpasst haben. – duffymo

+0

Ich denke, die Trennung, die ich habe, ist, dass der Link, den Sie bereitgestellt haben, XML-Mapping verwendet, während ich Anmerkungen verwende. Ich habe versucht, die bidirektionalen Anweisungen in diesem Link zu verwenden: http://docs.redhat.com/docs/en-US/JBoss_Enterprise_Application_Platform/4.2/html-single/Hibernate_Annotations_Reference_Guide/index.html, aber es produziert genau das gleiche Problem, ein endloses Schleife. –