[hibernate-issues] [Hibernate-JIRA] Created: (HHH-5109) @OneToOne - too many joins

Marek Romanowski (JIRA) noreply at atlassian.com
Tue Apr 13 14:29:58 EDT 2010


@OneToOne - too many joins
--------------------------

                 Key: HHH-5109
                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-5109
             Project: Hibernate Core
          Issue Type: Bug
          Components: annotations, core
    Affects Versions: 3.5.0-Final
            Reporter: Marek Romanowski
         Attachments: hibernate-one-to-one.zip

With classes like this:

@Entity
@Proxy(lazy=false)
class Owner {
  @javax.persistence.Id
  @javax.persistence.Column(name = "ID", columnDefinition = "BIGINT")
  public java.lang.Long getId() {
    return this.id;
  }
  
  public void setId(java.lang.Long newValue) {
    this.id = newValue;
  }
  
  private java.lang.Long id;
  
  @javax.persistence.OneToOne(targetEntity = Owned.class)
  @org.hibernate.annotations.Cascade( { org.hibernate.annotations.CascadeType.ALL })
  @javax.persistence.PrimaryKeyJoinColumn
  public Owned getOwned() {
    return this.owned;
  }
  
  public void setOwned(Owned owned) {
    this.owned = owned;
    if (owned != null) {
      owned.setOwner(this);
    }
  }
  
  private Owned owned;
}


@Entity
@Proxy(lazy=false)
class Owned {
  private java.lang.Long id;
  
  @javax.persistence.Id
  @javax.persistence.GeneratedValue(generator = "foreign")
  @org.hibernate.annotations.GenericGenerator(
      name = "foreign", 
      strategy = "foreign", 
      parameters = { @org.hibernate.annotations.Parameter(name = "property", value = "owner") })
      @javax.persistence.Column(name = "ID", columnDefinition = "BIGINT")
      public java.lang.Long getId() {
    return this.id;
  }
  
  public void setId(java.lang.Long newValue) {
    this.id = newValue;
  }
  
  @javax.persistence.OneToOne(targetEntity = Owner.class, mappedBy = "owned")
  @javax.persistence.PrimaryKeyJoinColumn
  public Owner getOwner() {
    return this.owner;
  }
  
  public void setOwner(Owner owner) {
    this.owner = owner;
  }
  
  private Owner owner;
}

Idea is to have one to one relation between Owner and Owned mapped by "id" properties in both entities. So for each pair owner.id == owned.id.

code:

session.load(Owner.class, 1L)

turns into SQL:

select owner0_.ID as ID0_2_, owned1_.ID as ID1_0_, owner2_.ID as ID0_1_
from Owner owner0_ left outer
     join Owned owned1_ on owner0_.ID=owned1_.ID 
     left outer join Owner owner2_ on owned1_.ID=owner2_.ID 
where owner0_.ID=?

Isn't it wrong? @OneToOne annotation on getOwner() has mappedBy="owned" property, so I would expect this code to generate SQL with only one join (only "owner join owned"). If this is correct H3 behaviour in this case, then write what should I change in annotations to get described behaviour, please.

I've attached maven project with one test encapsulating this issue.

-- 
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