-->
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.  [ 1 post ] 
Author Message
 Post subject: Bidirectional relationship causing infinite loop
PostPosted: Fri Apr 13, 2012 2:25 pm 
Newbie

Joined: Tue Feb 14, 2012 11:58 pm
Posts: 7
Hi all,

I have a very simple database with two tables: Departments [Id, Name] and Employees [Id, DepartmentsId, FirstName, LastName]. I am trying to get a bidirectional relationship working in Hibernate but it keeps generating an infinite loop and then a StackOverFlow exception. Here are my classes:

Departments:
Code:
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 javax.persistence.JoinTable; 
 
import static javax.persistence.GenerationType.IDENTITY; 
import javax.persistence.Id; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 
import javax.persistence.JoinColumn; 
 
/**
* 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") 
    @Column(name="DepartmentsId") 
    /*@OneToMany
    @JoinColumn(name="DepartmentsId", nullable=false)*/ 
    public Set<Employees> getEmployeeses() { 
        return this.employeeses; 
    } 
     
    public void setEmployeeses(Set employeeses) { 
        this.employeeses = employeeses; 
    } 
}


Employees:
Code:
Hi all,

I have a very simple database with two tables: Departments [Id, Name] and Employees [Id, DepartmentsId, FirstName, LastName]. I am trying to get a bidirectional relationship working in Hibernate but it keeps generating an infinite loop and then a StackOverFlow exception. Here are my classes:

Departments:
[code]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 javax.persistence.JoinTable; 
 
import static javax.persistence.GenerationType.IDENTITY; 
import javax.persistence.Id; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 
import javax.persistence.JoinColumn; 
 
/**
* 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") 
    @Column(name="DepartmentsId") 
    /*@OneToMany
    @JoinColumn(name="DepartmentsId", nullable=false)*/ 
    public Set<Employees> getEmployeeses() { 
        return this.employeeses; 
    } 
     
    public void setEmployeeses(Set employeeses) { 
        this.employeeses = employeeses; 
    } 
}[/code]

Employees:
[code]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 
    @JoinColumn(name="DepartmentsId", nullable=false, insertable=false, updatable=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; 
    } 
}


My HQL query is simply: "FROM Departments d JOIN FETCH d.employeeses e".

I have tried Departments using both the existing and commented-out sets of annotations on "getEmployeeses". According to everything I have been reading, including the Hibernate documentation on bidirectional collections (http://docs.jboss.org/hibernate/orm/3.6 ... irectional) these annotations should, in effect, set the "inverse" types for the two tables and thus avoid the problem I am running into, that every time "Departments" grabs an "Employees" set, each new "Employees" object creates another "Departments," which then creates another "Employees" set, so on and so forth, into an infinite loop. However, the issue still occurs unless I remove the "Departments" object from the "Employees" class, thus creating a unidirectional mapping, which I do not want to do. What the heck am I doing wrong here?


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

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.