[hibernate-issues] [Hibernate-JIRA] Closed: (HHH-4409) Infinite loop occurs while doing findById on a Parent domain Object having OneToMany relationship with child domain with composite primary key

Steve Ebersole (JIRA) noreply at atlassian.com
Wed May 12 16:58:24 EDT 2010


     [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-4409?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Steve Ebersole closed HHH-4409.
-------------------------------

    Resolution: Duplicate

> Infinite loop occurs while doing findById on a Parent domain Object having OneToMany relationship with child domain with composite primary key
> ----------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: HHH-4409
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-4409
>             Project: Hibernate Core
>          Issue Type: Improvement
>          Components: annotations
>         Environment: Hibernate Annotations 3.4.0.GA, HSqlDB and Oracle
>            Reporter: Steve Ebersole
>         Attachments: Organization.java, OrganizationApplications.java, OrganizationApplicationsPK.java
>
>
> We are using Hibernate annotations version 3.4.0.G.A
> We are establishing a OneToMany relationship using the annotation @OnetoMany for a Parent and Child domain objects
> where the child domain has a composite primary key.
> We have two domain objects 
> Organization [Parent]
> OrganizationApplications [Child]
> We want to have a OnetoMany relationship between Organization and OrganizationApplications.
> As shown below OrganizationApplications contains a composite primary key, of two columns(Organization Id, ApplicationId[foreignkey from other table called APPLICATIONS])
> Organizations.java
> -------------------
> @OneToMany(targetEntity=gov.osc.enrollment.backend.domain.OrganizationApplications.class, cascade=CascadeType.ALL, fetch = FetchType.EAGER,
> 	           mappedBy="id.organization")
> 	private Set<OrganizationApplications> organizationApps = new HashSet<OrganizationApplications>();
> OrganizationApplications.java
> ---------------------------------------------------------------------
> public class OrganizationApplications extends EnvelopeInfo implements Serializable {
> 	private static final long serialVersionUID = 1L;
> 	
> 	@EmbeddedId
> 	private OrganizationApplicationsPK id;
> 	public OrganizationApplicationsPK getId() {
> 		return id;
> 	}
> 	public void setId(OrganizationApplicationsPK id) {
> 		this.id = id;
> 	}
> OrganizationApplicationsPK.java
> ---------------------------------------------------------------------
> @Embeddable
> public class OrganizationApplicationsPK implements Serializable {
> 	private static final Long serialVersionUID = 1L;
> 	
> 	public OrganizationApplicationsPK() {
> 		super();
> 	}
> 	
> 	
> 	@ManyToOne
> 	@JoinColumn(name="APPLICATION_ID",nullable=false)
> 	private Applications application;
> 	@ManyToOne(targetEntity=gov.osc.enrollment.backend.domain.Organization.class, cascade=CascadeType.ALL)
> 	@JoinColumn(name="ORGANIZATION_ID", referencedColumnName="ORGANIZATION_ID", nullable=false, insertable=true, updatable=true)
> 	private Organization organization;
> 	public Applications getApplication() {
> 		return application;
> 	}
> 	public void setApplication(Applications application) {
> 		this.application = application;
> 	}
> 	public Organization getOrganization() {
> 		return organization;
> 	}
> 	public void setOrganization(Organization organization) {
> 		this.organization = organization;
> 	}
> 	@Override
> 	public boolean equals(Object o) {
> 		if (o == this) {
> 			return true;
> 		}
> 		if ( ! (o instanceof OrganizationApplicationsPK)) {
> 			return false;
> 		}
> 		OrganizationApplicationsPK other = (OrganizationApplicationsPK) o;
> 		return (this.getOrganization().getId() == other.getOrganization().getId())
> 			&& (this.getApplication().getId() == other.getApplication().getId());
> 	}
> 	@Override
> 	public int hashCode() {
> 		final int prime = 31;
> 		int hash = 17;
> 		hash = hash * prime + ((int) (this.getOrganization().getId() ^ (this.getOrganization().getId() >>> 32)));
> 		hash = hash * prime + ((int) (this.getApplication().getId() ^ (this.getApplication().getId() >>> 32)));
> 		return hash;
> 	}
> }
> Please see the attached java files for complete code and also the exception stack trace.
> Questions:
> 1.  When we do a findById query on Organization table the system goes into infinite loop and never gets out .
> 	
> 	How ever we are able to insert a record in Organization and its child OrganizationApplications.
> 2.  In the Organization.java domain, if you notice we are using mappedby="id.organization". Is this a valid mapping ? 
>        
>        If not why does this parameter work for insert and not for a entityManager.findById, doing so leads to infinite loop.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the hibernate-issues mailing list