Incredible set of statements

2 Messages Forum Options Options
Permalink
Beniamin Mazan
Incredible set of statements
Reply Threaded More
Print post
Permalink
I got Entity with relation to itself like :

public class ActionLog {

        @ManyToOne(cascade = {CascadeType.MERGE, CascadeType.REFRESH}, fetch = FetchType.EAGER)
        @JoinColumn(name = "product_id", nullable = false)
        private Product product;

        @ManyToOne(cascade = {CascadeType.MERGE, CascadeType.REFRESH}, fetch = FetchType.EAGER)
        @JoinColumn(name = "parent_id", nullable = true)
        private ActionLog parent;

        @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "parent")
        @OrderBy(value = "created DESC")
        private List<ActionLog> children = new ArrayList<ActionLog>();

}

When I execute named query to load Product with ActionLogs :
SELECT p FROM Product p LEFT JOIN FETCH p.logs WHERE p.id = :id
OpenJPA generates strange set of select.

At first is selects all ActionLogs for specified Product - it's OK. But next it build single statement to select children of each ActionLog has been found in the first step.

Couldn't it be made simplier?

Beniamin
thanks, Beniamin
My homesite - http://www.mazan.pl
Pinaki Poddar
Re: Incredible set of statements
Reply Threaded More
Print post
Permalink
Hi,
OpenJPA provides several options to tune fetch mode [1]. However, the scenario you describe may not benefit from them. Because,
a) once OpenJPA eager-joins into a class (i.e. Product.logs), it cannot issue any further eager to-many joins or parallel selects from that class in the same query (i.e. ActionLogs.children). To-one joins, however, can recurse to any level.
b) when OpenJPA knows that it is selecting for a single object only, it never uses parallel mode, because the additional selects can be made lazily just as efficiently.


[1] http://openjpa.apache.org/docs/latest/manual/manual.html#ref_guide_perfpack_eager



Beniamin Mazan wrote:
I got Entity with relation to itself like :

public class ActionLog {

        @ManyToOne(cascade = {CascadeType.MERGE, CascadeType.REFRESH}, fetch = FetchType.EAGER)
        @JoinColumn(name = "product_id", nullable = false)
        private Product product;

        @ManyToOne(cascade = {CascadeType.MERGE, CascadeType.REFRESH}, fetch = FetchType.EAGER)
        @JoinColumn(name = "parent_id", nullable = true)
        private ActionLog parent;

        @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "parent")
        @OrderBy(value = "created DESC")
        private List<ActionLog> children = new ArrayList<ActionLog>();

}

When I execute named query to load Product with ActionLogs :
SELECT p FROM Product p LEFT JOIN FETCH p.logs WHERE p.id = :id
OpenJPA generates strange set of select.

At first is selects all ActionLogs for specified Product - it's OK. But next it build single statement to select children of each ActionLog has been found in the first step.

Couldn't it be made simplier?

Beniamin