Multiple writable mappings in Java Persistence API

Seit kurzem setzte ich mich mit der Java Persistence API auseinander, das mit Hibernate und dem von uns eingesetzten Oracle Toplink implementiert wurde.

Folgende Fehlermeldung beschäftigte mich bei einer OneToMany-Relation

Multiple writable mappings exist for the field [tabltenname.spaltenname]. Only one may be defined as writable, all others must be specified read-only.

Die Lösung war das explizite deklarieren der Spalte als “read only”, was man mit den Optionen nullable=false, insertable=false und updatable=false bei der @Column-Annotation erreicht.

Spannend, nicht? ;)

java-coffee-cup-300x219

oracle update mit inner join

wieder mal ein kleines howto, für etwas, das mir wieder mal auf die schnelle nicht eingefallen ist.

wenn man in einer tabelle A alle spalten a auf einen bestimmten wert setzen möchte, die eine bestimmte bedingung (A.b = B.b) mit einer anderen tabelle B erfüllen, geht das in oracle so:

UPDATE A
set A.a =
(SELECT B.a
FROM B
WHERE A.b = B.b)

in access würde es so gehen:

update A inner join B on
A.b = B.b
SET A.a = B.a

in SQL server so:
UPDATE A
SET A.a = B.a
INNER JOIN B
ON A.b = B.b

siehe z.b. auch sql-tutorial

XSQL treibt mich in den wahnsinn

mal wieder was aus meinem spannenden alltag als software-entwickler:

Oracle XSQL Servlet gibt so nette fehlermeldungen aus wie “Ungültiger Spaltenindex“, die aber irgendwie nicht direkt mit dem Index, der Anzahl oder Reihenfolge der Spalten des SQL statements oder ähnlichem zu tun hatte…

die lösung des problems war aber bald geklärt, da ich mit hilfe eines lieben arbeitskollegen erkannte, dass die anzahl der bind-params nicht mit der anzahl der verwendeten params übereinstimmt.

in xsql müssen alle params, die mit dem <xsql:query .. />-tag bind-params übergeben werden verwendet werden. diese können mit einem fragezeichen ? oder direkt mit dem prefix “:” angesprochen werden, aber nicht zu wenige, keine doppelten verwendungen und nicht zu viele… eben genau richtig passend muss es sein. das ist die banale lösung.

.

wieso können programmierer dieser tools nicht vernünftige fehlermeldungen ausgeben? sowas wie “Anzahl der bind-params stimmt nicht mit der Anzahl der verwendeten Params überein”. da wär ich und wahrscheinlich alle xsql progger sehr glücklich. ein anderes beispiel für grauenhafte fehlermeldungen sind die gute, alte NullPointerException in Java oder “undefined is not a function” in helma ;)

.

nachtrag: die selbe lösung gibt es auch bei dr fehlermeldung “fehlender IN- oder OUT-Parameter auf Index:: i“. hier wird ein parameter, der mit bind-params gesetzt wird, öfter im SQL verwendet, als er definiert wurde. die lösung: den parameter sooft in bind-params übergeben, wie er verwendet wird!