I have 3 entities:

@Entity
class A
{
        @Id @GeneratedValue(strategy = GenerationType.SEQUENCE)
        Long id
        
        @Basic
        String name
        
        @OneToMany(mappedBy = "a", fetch = FetchType.EAGER, cascade = 
[CascadeType.ALL])
        List<B> bs = []
}


@Entity
class B
{
        @Id @GeneratedValue(strategy = GenerationType.SEQUENCE)
        Long id

        @Basic
        String name
        
        @ManyToOne(cascade = [CascadeType.PERSIST, CascadeType.MERGE, 
CascadeType.DETACH])
        A a
        
        @OneToMany(mappedBy = "b", fetch = FetchType.EAGER, cascade = 
[CascadeType.ALL])
        List<C> cs = []

        void setA(A a)
        {
        if(this.a != null)
        {
            this.a.getBs().remove(this)
        }

        if(a != null)
        {
            a.getBs().add(this)
        }

        this.a = a
        }
}


@Entity
class C
{
        @Id @GeneratedValue(strategy = GenerationType.SEQUENCE)
        Long id

        @Basic
        String name
        
        @ManyToOne(cascade = [CascadeType.PERSIST, CascadeType.MERGE, 
CascadeType.DETACH])
        B b
        
        void setB(B b)
        {
        if(this.b != null)
        {
            this.b.getCs().remove(this)
        }

        if(b != null)
        {
            b.getCs().add(this)
        }

        this.b = b
        }
}


A and B has OneToMany relations. Both relations defined by fetch = 
FetchType.EAGER.

in persistence.xml

                        <property name="openjpa.jdbc.EagerFetchMode" 
value="join"/>

Therefore, whe I do em.find(A.class, id), it produces several sqls instead of 
one:

SELECT t0.NAME, t1.A_ID, t1.ID, t1.NAME 
    FROM APP.A t0 LEFT OUTER JOIN APP.B t1 ON t0.ID = t1.A_ID 
    WHERE t0.ID = ? 
    ORDER BY t1.A_ID ASC 
[params=(long) 1]
5921  openjpa-examples  TRACE  [main] openjpa.jdbc.SQL - <t 1132441875, conn 
1170789081> [6 ms] spent
5952  openjpa-examples  TRACE  [main] openjpa.jdbc.SQL - <t 1132441875, conn 
1170789081> executing prepstmnt 636562801 
SELECT t0.ID, t0.NAME 
    FROM APP.C t0 
    WHERE t0.B_ID = ? 
[params=(long) 52]
5953  openjpa-examples  TRACE  [main] openjpa.jdbc.SQL - <t 1132441875, conn 
1170789081> [1 ms] spent
5957  openjpa-examples  TRACE  [main] openjpa.jdbc.SQL - <t 1132441875, conn 
1170789081> executing prepstmnt 745129193 
SELECT t0.ID, t0.NAME 
    FROM APP.C t0 
    WHERE t0.B_ID = ? 
[params=(long) 51]

How to select A and eager fetch B and Bs Cs field?

-- 
WBR Turtle//BAZON Group

Attachment: signature.asc
Description: This is a digitally signed message part.

Reply via email to