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!
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! –
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
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. –