It seems to me that he should put the lazy on the one-to-many relation and
not the many-to-one relation.
F
Fay Wang
<[EMAIL PROTECTED]
> To
[email protected]
cc
05/01/2008 08:41
AM Subject
Re: Tons of unneeded queries
Please respond to
[EMAIL PROTECTED]
e.org
Hi Nick,
The unneeded queries can be removed if you specify lazy relationship
with Account in your TimeDependentAccountData entity as shown below:
@Entity
public class TimeDependentAccountData {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
@ManyToOne(
cascade = {CascadeType.PERSIST},
fetch = FetchType.LAZY, <====== change from EAGER to LAZY
optional = false
)
private Account account;
- Fay
--- On Wed, 4/30/08, Nikolas Everett <[EMAIL PROTECTED]> wrote:
From: Nikolas Everett <[EMAIL PROTECTED]>
Subject: Tons of unneeded queries
To: [email protected]
Date: Wednesday, April 30, 2008, 8:00 AM
I'm having a problem where one of my dependent objects is fetching the
object it is dependent on, even though that dependent object has already
fetched.
I am using OpenJpa 1.0.2 backed into Postgres 8.2.6. I have two objects:
Account and TimeDependentAccountData.
@Entity
@Table([EMAIL PROTECTED](columnNames="uuid")})
public class Account {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
@OneToMany(cascade={CascadeType.PERSIST, CascadeType.REFRESH,
CascadeType.MERGE}, fetch=FetchType.EAGER, mappedBy="account")
@OrderBy("startTime ASC")
private List<TimeDependentAccountData> timeDependentAccountData;
...getters and setters...
}
Entity
public class TimeDependentAccountData {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
@ManyToOne(cascade = {CascadeType.PERSIST}, fetch = FetchType.EAGER,
optional = false)
private Account account;
...getters and setters...
}
When I do something like em.createQuery("SELECT a FROM Account")
OpenJPA
runs the following SQL queries:
2785 SELECT t0.id, t0.uuid FROM Account t0
2797 SELECT t0.id, t1.id, t1.field1, t1.field2, t1.field3, t1.field4 FROM
Account t0 INNER JOIN TimeDependentAccountData t1 ON t0.id = t1.account_id
ORDER BY t0.id ASC, t1.startTime ASC
115796 SELECT t1.id, t1.uuid FROM TimeDependentAccountData t0 INNER JOIN
Account t1 ON t0.account_id = t1.id WHERE t0.id = ? [params=(int) 1
115799 SELECT t1.id, t1.uuid FROM TimeDependentAccountData t0 INNER JOIN
Account t1 ON t0.account_id = t1.id WHERE t0.id = ? [params=(int) 2
115800 SELECT t1.id, t1.uuid FROM TimeDependentAccountData t0 INNER JOIN
Account t1 ON t0.account_id = t1.id WHERE t0.id = ? [params=(int) 3
115802 SELECT t1.id, t1.uuid FROM TimeDependentAccountData t0 INNER JOIN
Account t1 ON t0.account_id = t1.id WHERE t0.id = ? [params=(int) 4
115804 SELECT t1.id, t1.uuid FROM TimeDependentAccountData t0 INNER JOIN
Account t1 ON t0.account_id = t1.id WHERE t0.id = ? [params=(int) 5
115805 SELECT t1.id, t1.uuid FROM TimeDependentAccountData t0 INNER JOIN
Account t1 ON t0.account_id = t1.id WHERE t0.id = ? [params=(int) 6
115807 SELECT t1.id, t1.uuid FROM TimeDependentAccountData t0 INNER JOIN
Account t1 ON t0.account_id = t1.id WHERE t0.id = ? [params=(int) 7
115808 SELECT t1.id, t1.uuid FROM TimeDependentAccountData t0 INNER JOIN
Account t1 ON t0.account_id = t1.id WHERE t0.id = ? [params=(int) 8
115810 SELECT t1.id, t1.uuid FROM TimeDependentAccountData t0 INNER JOIN
Account t1 ON t0.account_id = t1.id WHERE t0.id = ? [params=(int) 9
115811 SELECT t1.id, t1.uuid FROM TimeDependentAccountData t0 INNER JOIN
Account t1 ON t0.account_id = t1.id WHERE t0.id = ? [params=(int) 10
115813 SELECT t1.id, t1.uuid FROM TimeDependentAccountData t0 INNER JOIN
Account t1 ON t0.account_id = t1.id WHERE t0.id = ? [params=(int) 11
115814 SELECT t1.id, t1.uuid FROM TimeDependentAccountData t0 INNER JOIN
Account t1 ON t0.account_id = t1.id WHERE t0.id = ? [params=(int) 12
115816 SELECT t1.id, t1.uuid FROM TimeDependentAccountData t0 INNER JOIN
Account t1 ON t0.account_id = t1.id WHERE t0.id = ? [params=(int) 13
115817 SELECT t1.id, t1.uuid FROM TimeDependentAccountData t0 INNER JOIN
Account t1 ON t0.account_id = t1.id WHERE t0.id = ? [params=(int) 14
115819 SELECT t1.id, t1.uuid FROM TimeDependentAccountData t0 INNER JOIN
Account t1 ON t0.account_id = t1.id WHERE t0.id = ? [params=(int) 15
115821 SELECT t1.id, t1.uuid FROM TimeDependentAccountData t0 INNER JOIN
Account t1 ON t0.account_id = t1.id WHERE t0.id = ? [params=(int) 16
115822 SELECT t1.id, t1.uuid FROM TimeDependentAccountData t0 INNER JOIN
Account t1 ON t0.account_id = t1.id WHERE t0.id = ? [params=(int) 17
115824 SELECT t1.id, t1.uuid FROM TimeDependentAccountData t0 INNER JOIN
Account t1 ON t0.account_id = t1.id WHERE t0.id = ? [params=(int) 18
115825 SELECT t1.id, t1.uuid FROM TimeDependentAccountData t0 INNER JOIN
Account t1 ON t0.account_id = t1.id WHERE t0.id = ? [params=(int) 19
115827 SELECT t1.id, t1.uuid FROM TimeDependentAccountData t0 INNER JOIN
Account t1 ON t0.account_id = t1.id WHERE t0.id = ? [params=(int) 20
115828 SELECT t1.id, t1.uuid FROM TimeDependentAccountData t0 INNER JOIN
Account t1 ON t0.account_id = t1.id WHERE t0.id = ? [params=(int) 21
115830 SELECT t1.id, t1.uuid FROM TimeDependentAccountData t0 INNER JOIN
Account t1 ON t0.account_id = t1.id WHERE t0.id = ? [params=(int) 22
115831 SELECT t1.id, t1.uuid FROM TimeDependentAccountData t0 INNER JOIN
Account t1 ON t0.account_id = t1.id WHERE t0.id = ? [params=(int) 23
115833 SELECT t1.id, t1.uuid FROM TimeDependentAccountData t0 INNER JOIN
Account t1 ON t0.account_id = t1.id WHERE t0.id = ? [params=(int) 24
115835 SELECT t1.id, t1.uuid FROM TimeDependentAccountData t0 INNER JOIN
Account t1 ON t0.account_id = t1.id WHERE t0.id = ? [params=(int) 25
115836 SELECT t1.id, t1.uuid FROM TimeDependentAccountData t0 INNER JOIN
Account t1 ON t0.account_id = t1.id WHERE t0.id = ? [params=(int) 26
And another 400 or so of these.
What can I do to prevent this silliness?
Thanks,
--Nik
____________________________________________________________________________________
Be a better friend, newshound, and
know-it-all with Yahoo! Mobile. Try it now.
http://mobile.yahoo.com/;_ylt=Ahu06i62sR8HDtDypao8Wcj9tAcJ