[jboss-user] [EJB 3.0] - merge one-to-one strategy
lpiccoli
do-not-reply at jboss.com
Tue Oct 31 23:23:04 EST 2006
hi all,
I am having troubles understanding the EJB3 updating strategy. I am familar with the traditional mechanism of dealing with just FK when updating a one-to-one relationship. However with EJB3 the FK is now a object.
>From the EJB3trail there is a example that does the following for a persist.
It loads both foreign key objects before setting, then persisting.
| public double calculate (int fundId, int investorId, double saving) {
| 26
| 27 Investor investor =
| 28 em.find(Investor.class,
| 29 Integer.valueOf(investorId));
| 30 Fund fund =
| 31 em.find(Fund.class,
| 32 Integer.valueOf(fundId));
| 33
| 34 int start = investor.getStartAge();
| 35 int end = investor.getEndAge();
| 36 double growthrate = fund.getGrowthrate();
| 37
| 38 double tmp = Math.pow(1. + growthrate / 12., 12. * (end - start) + 1);
| 39 double result = saving * 12. * (tmp - 1) / growthrate;
| 40 Timestamp ts = new Timestamp (System.currentTimeMillis());
| 41
| 42 TimedRecord rec =
| 43 new TimedRecord (fund, investor, saving, result, ts);
| 44 em.persist (rec);
| 45
| 46 return result;
| 47 }
|
Is the same mechanism required when updating?
Unfortunetly the EJB3trail does not have a one-to-one merge example.
Is something like the following performant or are there better mechanisms?
The major issue is executing the load of the FK relationship object. Which seems expensive when i already have the FK id.
|
| strategy 1
|
| public double update (int recId, int fundId, int investorId, double saving) {
|
| Investor investor =
| em.find(Investor.class,
| Integer.valueOf(investorId));
| Fund fund =
| em.find(Fund.class,
| Integer.valueOf(fundId));
| TimeRecord rec =
| em.find(Fund.class,
| Integer.valueOf(fundId));
|
| rec.setSaving( saving);
| rec.setFund( fund );
| rec.setInvestor( investor );
| em.merge (rec);
|
| return result;
| }
|
I have tried the following with little success as it complains about transient Objects
|
| strategy 2 not working.
|
| public double update2 (int recId, int fundId, int investorId, double saving) {
|
| Investor investor =new Investor( investorId);
| Fund fund = new Fund( fundId);
| TimeRecord rec =
| em.find(Fund.class,
| Integer.valueOf(fundId));
|
| rec.setSaving( saving);
| rec.setFund( fund );
| rec.setInvestor( investor );
| em.merge (rec);
|
| return result;
| }
|
|
So my question is does the merge on one-to-one relationship require fullly populated detached objects or can it be done with just the id for the FK?
many thanks
-lp
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3982272#3982272
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3982272
More information about the jboss-user
mailing list