[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [eclipselink-users] No OptimisticLocking Exception incombination with ReturnInsert and/or ReturnUpdate
|
ReturningPolicy cannot be used with
OptimisticLocking.
Eclipselink throws OptimisticLockException if UPDATE returns 0
(number of updated rows).
Unfortunately that doesn't work with Oracle anonymous blocks
or stored procedures: BEGIN ... END; always returns one.
Please log enhancement request.
In returning case currently no update is performed on the db,
but no PessimisticLockException is thrown, too
Note that in case no update was performed all the returned
values are nulls (or default values for primitive types).
To workaround handle outputParametersDetected and raise
OptimisticLockException yourself in case all returned values are
null.
----- Original Message -----
Sent: Tuesday, August 11, 2009 2:29 AM
Subject: AW: [eclipselink-users] No OptimisticLocking
Exception incombination with ReturnInsert and/or ReturnUpdate
So far so good but.
If there
are other changes going on at the Database between first load and Update ->
trying to update data from an old state. There is no OptimisticLockingException
to.
1. JavaApp loads the Date by select
2. Update occurs on the
Database by an PL/SQL-Job or something else
3. JavaApp do an Update with all
the old values in the where clause to detect an OprimisticLocking
4. because
of the changed Data at the Database the Update doesn't affect any columns and
the Returnvalues of the ReturnInsert/ReturnUpdate Fields are mapped to null
--> But NO OptimisticLockingException <-- although there is
one!
Log with
ReturnInsert/ReturnUbdate:
-----------------------------------
FEIN:
SELECT IDSYNDICAT, SYNNO, SYNNOM, UTILISATEUR, TEMPS, SYN_CODESEKTORLBE,
SYN_DATEBEGINN, SYN_DATEENDE, SYN_INSCHRIFT, CRE_DAT, CRE_KURZZ, IDCANTON,
IDDISTRICT, SYN_FRUEHJAHRSVERSAND_ID, SYN_VZGRECHTSFORM_ID FROM GESTHO.SYNDICAT
WHERE (SYNNO = ?)
bind => [152]
<- skip logs till update
->
FEIN: BEGIN UPDATE GESTHO.SYNDICAT SET IDCANTON = ? WHERE
((IDSYNDICAT = ?) AND ((((((((((((((SYNNO = ?) AND (SYNNOM = ?)) AND
(UTILISATEUR = ?)) AND (TEMPS = ?)) AND (SYN_CODESEKTORLBE = ?)) AND
(SYN_DATEBEGINN = ?)) AND (SYN_DATEENDE IS NULL)) AND (SYN_INSCHRIFT = ?)) AND
(CRE_DAT = ?)) AND (CRE_KURZZ = ?)) AND (IDCANTON = ?)) AND (IDDISTRICT = ?))
AND (SYN_FRUEHJAHRSVERSAND_ID = ?)) AND (SYN_VZGRECHTSFORM_ID = ?))) RETURNING
CRE_KURZZ, UTILISATEUR, CRE_DAT, TEMPS INTO ?, ?, ?, ?; END;
bind => [25,
152, 152, CHAM, BM, 2009-08-11 08:02:47.0, 2, 1907-01-01 00:00:00.0, CHAM,
2001-08-19 00:00:00.0, INIT, 9, 6, 1896, 1686, => CRE_KURZZ, =>
UTILISATEUR, => CRE_DAT, => TEMPS]
AM FEINSTEN: Assign return row
DatabaseRecord(
GESTHO.SYNDICAT.CRE_KURZZ =>
INIT
GESTHO.SYNDICAT.UTILISATEUR => BM
GESTHO.SYNDICAT.CRE_DAT =>
2001-08-19 00:00:00.0
GESTHO.SYNDICAT.TEMPS => 2009-08-11
08:16:17.0)
<- skip logs till update doing update on the db by
sqldeveloper in the meanwhile (SYNNOM='CHA') ->
FEIN: BEGIN UPDATE
GESTHO.SYNDICAT SET IDCANTON = ? WHERE ((IDSYNDICAT = ?) AND ((((((((((((((SYNNO
= ?) AND (SYNNOM = ?)) AND (UTILISATEUR = ?)) AND (TEMPS = ?)) AND
(SYN_CODESEKTORLBE = ?)) AND (SYN_DATEBEGINN = ?)) AND (SYN_DATEENDE IS NULL))
AND (SYN_INSCHRIFT = ?)) AND (CRE_DAT = ?)) AND (CRE_KURZZ = ?)) AND (IDCANTON =
?)) AND (IDDISTRICT = ?)) AND (SYN_FRUEHJAHRSVERSAND_ID = ?)) AND
(SYN_VZGRECHTSFORM_ID = ?))) RETURNING CRE_KURZZ, UTILISATEUR, CRE_DAT, TEMPS
INTO ?, ?, ?, ?; END;
bind => [9, 152, 152, CHAM, BM, 2009-08-11
08:16:17.0, 2, 1907-01-01 00:00:00.0, CHAM, 2001-08-19 00:00:00.0, INIT, 25, 6,
1896, 1686, => CRE_KURZZ, => UTILISATEUR, => CRE_DAT, =>
TEMPS]
AM FEINSTEN: Assign return row
DatabaseRecord(
GESTHO.SYNDICAT.CRE_KURZZ =>
null
GESTHO.SYNDICAT.UTILISATEUR => null
GESTHO.SYNDICAT.CRE_DAT =>
null
GESTHO.SYNDICAT.TEMPS => null)
Log without
ReturnInsert/ReturnUpdate:
--------------------------------------
FEIN:
SELECT IDSYNDICAT, SYNNO, SYNNOM, UTILISATEUR, TEMPS, SYN_CODESEKTORLBE,
SYN_DATEBEGINN, SYN_DATEENDE, SYN_INSCHRIFT, CRE_DAT, CRE_KURZZ, IDCANTON,
IDDISTRICT, SYN_FRUEHJAHRSVERSAND_ID, SYN_VZGRECHTSFORM_ID FROM GESTHO.SYNDICAT
WHERE (SYNNO = ?)
bind => [152]
<- skip logs till update
->
FEIN: UPDATE GESTHO.SYNDICAT SET IDCANTON = ? WHERE ((IDSYNDICAT =
?) AND ((((((((((((((SYNNO = ?) AND (SYNNOM = ?)) AND (UTILISATEUR = ?)) AND
(TEMPS = ?)) AND (SYN_CODESEKTORLBE = ?)) AND (SYN_DATEBEGINN = ?)) AND
(SYN_DATEENDE IS NULL)) AND (SYN_INSCHRIFT = ?)) AND (CRE_DAT = ?)) AND
(CRE_KURZZ = ?)) AND (IDCANTON = ?)) AND (IDDISTRICT = ?)) AND
(SYN_FRUEHJAHRSVERSAND_ID = ?)) AND (SYN_VZGRECHTSFORM_ID = ?)))
bind =>
[25, 152, 152, CHAM, BM, 2009-08-11 07:53:18.0, 2, 1907-01-01 00:00:00.0, CHAM,
2001-08-19 00:00:00.0, INIT, 9, 6, 1896, 1686]
<- skip logs till
update doing update on the db by sqldeveloper in the meanwhile (SYNNOM='CHA')
->
FEIN: UPDATE GESTHO.SYNDICAT SET IDCANTON = ? WHERE ((IDSYNDICAT =
?) AND ((((((((((((((SYNNO = ?) AND (SYNNOM = ?)) AND (UTILISATEUR = ?)) AND
(TEMPS = ?)) AND (SYN_CODESEKTORLBE = ?)) AND (SYN_DATEBEGINN = ?)) AND
(SYN_DATEENDE IS NULL)) AND (SYN_INSCHRIFT = ?)) AND (CRE_DAT = ?)) AND
(CRE_KURZZ = ?)) AND (IDCANTON = ?)) AND (IDDISTRICT = ?)) AND
(SYN_FRUEHJAHRSVERSAND_ID = ?)) AND (SYN_VZGRECHTSFORM_ID = ?)))
bind =>
[9, 152, 152, CHAM, BM, 2009-08-11 07:53:56.0, 2, 1907-01-01 00:00:00.0, CHAM,
2001-08-19 00:00:00.0, INIT, 25, 6, 1896, 1686]
WARNUNG: Local Exception
Stack:
Exception [EclipseLink-5006] (Eclipse Persistence Services - 1.0.1
(Build 20080905)):
org.eclipse.persistence.exceptions.OptimisticLockException
Exception
Description: The object
[ch.braunvieh.argus_core.db.argus.entity.Syndicat[idsyndicat=152]] cannot be
updated because it has changed or been deleted since it was last read.
Class> ch.braunvieh.argus.association.db.Association Primary Key>
[152]
> -----Ursprüngliche Nachricht-----
> Von: eclipselink-users-bounces@xxxxxxxxxxx
[mailto:eclipselink-users-
> bounces@xxxxxxxxxxx] Im Auftrag von Andrei
Ilitchev
> Gesendet: Montag, 10. August 2009 16:49
> An: EclipseLink
User Discussions
> Betreff: Re: [eclipselink-users] No OptimisticLocking
Exception in
> combination with ReturnInsert and/or ReturnUpdate
>
> That sounds correct:
>
> Without return after the first
update the states of the object in the
> cache
> (Java app.) and in
the db differ (because of the trigger);
> with return however the db value
created by the trigger is returned
> back to
> the Java app.,
therefore the states of object in the cache and the db
> are
> the
same - hence no OptimisticLockException.
>
> ----- Original Message
-----
> From: <martin.berner@xxxxxxxxxxxx>
> To:
"EclipseLink User Discussions" <eclipselink-users@xxxxxxxxxxx>
> Sent:
Monday, August 10, 2009 4:23 AM
> Subject: [eclipselink-users] No
OptimisticLocking Exception in
> combination
> with ReturnInsert
and/or ReturnUpdate
>
>
> Hy,
> I annotated an Entity
with
> @OptimisticLocking(type=OptimisticLockingType.ALL_COLUMNS) to get
an
> OptimisticLickingException in case of an Update with old Data.
Database
> is
> Oracle 10g. We have fields on the Table which are
Updated by Oracle
> Triggers
> on Update and Insert so I annotated
dies Fields by @ReturnInsert and
> @ReturnUpdate:
>
> @Basic(optional =
false)
> @Column(name = "UTILISATEUR", nullable =
false, length = 10)
>
@ReturnInsert
>
@ReturnUpdate
> private String mutSign;
>
> If I perform a Update on that Entity without ReturnInsert and
>
ReturnUpdate,
> and try to perform another update on the same Entity I get
an
> OptimisticLockingException because The Fields have changed per
Trigger
> on
> the Database.
>
> But with The
Annotation of ReturnInsert and ReturnUpdate I didn't get
> an
>
OptimisticLockingException even if there is one.
> The only Thing I see in
the Log is, that it assign null to the Fields
> annotated by ReturnInsert
and ReturnUpdate by Returnvalue in case of
> old
> Data, bat no
Exception.
> In Fact the column wouldn't be updated, which is correct
because of the
> generated WHERE - clause.
>
> Is it a
Problem combining OptimisticLocking with ReturnInsert and/or
>
ReturnUpdate or have I configured something wrong? Or is it fixed in a
>
newer
> Version of EL (I'm Using EL 1.0.1 distributed by
GlassfishV3prelude)
>
> Thanks for any Help
>
> Berner
Martin
>
> _______________________________________________
>
eclipselink-users mailing list
> eclipselink-users@xxxxxxxxxxx> https://dev.eclipse.org/mailman/listinfo/eclipselink-users>
> _______________________________________________
>
eclipselink-users mailing list
> eclipselink-users@xxxxxxxxxxx> https://dev.eclipse.org/mailman/listinfo/eclipselink-users_______________________________________________
eclipselink-users
mailing list
eclipselink-users@xxxxxxxxxxxhttps://dev.eclipse.org/mailman/listinfo/eclipselink-users