Von:
eclipselink-users-bounces@xxxxxxxxxxx
[mailto:eclipselink-users-bounces@xxxxxxxxxxx] Im Auftrag von Andrei
Ilitchev
Gesendet: Dienstag, 11. August 2009 19:49
An: EclipseLink User Discussions
Betreff: 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@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users