Hibernate连接表延迟加载

Hibernate连接表延迟加载,hibernate,one-to-many,hibernate-mapping,jointable,Hibernate,One To Many,Hibernate Mapping,Jointable,我使用Hibernate4.1.6.Final。在我的例子中,@OneToOne关联与@JoinTable的延迟加载不起作用 表: 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

我使用Hibernate4.1.6.Final。在我的例子中,@OneToOne关联与@JoinTable的延迟加载不起作用

表:

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")
);
和映射

@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;
}

当我通过id获取Person对象时,比如

 Person person = (Person)session.get(Person.class,1L);
hibernate生成此查询

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

如何避免“左外联接”和延迟加载Address类

该地址不是急切加载的。为了使Hibernate能够创建包含地址ID的未初始化代理,只有它的ID是在需要时实际加载地址所必需的。感谢replay@JBNizet。但是如何避免在选择person对象时使用“左连接地址”。例如,当使用“共享主键”策略的一对一映射时,可以通过使用optional=false属性来避免实体初始化。为什么对joinTable使用一对一?将fk列添加到person what links on address,而不使用joinTable,因为惰性初始化将只加载fk而不加载任何联接。
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=?