1

I use hibernate 4.1.6.Final. And in my case lazy loading of @OneToOne association with @JoinTable didn't work.

TABLES:

CREATE TABLE PERSON
(
"ID"     NUMBER NOT NULL ENABLE,

"NAME"     VARCHAR2(200 BYTE) NOT NULL,

CONSTRAINT "PERSON_PK" PRIMARY KEY ("ID")

);


CREATE TABLE ADDRESS
(
"ID"     NUMBER NOT NULL ENABLE,
"ADDR"     VARCHAR2(200 BYTE) NOT NULL,
CONSTRAINT "ADDRESS_PK" PRIMARY KEY ("ID")
);



CREATE TABLE PERSON_ADDRESS
(
"P_ID"        NUMBER NOT NULL,
"A_ID"        NUMBER NOT NULL,

CONSTRAINT "PA_PK" PRIMARY KEY ("P_ID","A_ID"),
CONSTRAINT "PERS_FK" FOREIGN KEY ("P_ID") REFERENCES PERSON ("ID"),
CONSTRAINT "ADD_FK"   FOREIGN KEY ("A_ID") REFERENCES ADDRESS ("ID"),
CONSTRAINT "A_UNIQUE"  UNIQUE ("A_ID"),
CONSTRAINT "P_UNIQUE"  UNIQUE ("P_ID")
);

and mapping

@Entity
@Table(name = "PERSON")
@SequenceGenerator(name = "EMP_SEQ1", sequenceName = "EMP_SEQ")
public class Person {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "EMP_SEQ1")
@Column(name = "ID")
public Long id;

@Column(name = "NAME")
public String name;

@OneToOne(fetch = FetchType.LAZY, optional = false)
@JoinTable(name = "PERSON_ADDRESS", joinColumns = @JoinColumn(name = "P_ID"),      inverseJoinColumns = @JoinColumn(name = "A_ID"))
public Address address;
}


@Entity
@Table(name = "ADDRESS")
@SequenceGenerator(name = "EMP_SEQ1", sequenceName = "EMP_SEQ")
public class Address {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "EMP_SEQ1")
@Column(name = "ID")
public Long id;

@Column(name = "ADDR")
public String name;   
}

when I get the Person object by id, like

 Person person = (Person)session.get(Person.class,1L);

hibernate produce this query

select
    person0_.ID as ID10_0_,
    person0_.NAME as NAME10_0_,
    person0_1_.A_ID as A1_11_0_ 
from
    PERSON person0_ 
left outer join
    PERSON_ADDRESS person0_1_ 
        on person0_.ID=person0_1_.P_ID 
where
    person0_.ID=?

how can I avoid the "left outer join" and lazy load the Address class

  • 1
    The address is not eagerly-loaded. Only its ID is, in order for Hibernate to be able to create an uninitialized proxy containing the ID of the address, necessary to actually load the address when needed. – JB Nizet Jun 22 '14 at 12:44
  • Thanks for replay @JBNizet. But how avoid the "left join with address" when select a person object. For example when using one-to-one mapping with "shared primary key" strategy entity initialization can be avoided by using optional=false attribute. – user3764570 Jun 24 '14 at 18:53
  • Why are you use one-to-one with joinTable ? Add fk-column to person what links on address, and not use joinTable, when lazy initialization will load fk only without any joins. – Fire Oct 07 '14 at 13:18

0 Answers0