Ich habe ein Legacy-Schema, das nicht geändert werden kann. Ich verwende eine Basisklasse für die gemeinsamen Funktionen und es enthält ein eingebettetes Objekt. Es gibt ein Feld, das normalerweise dem eingebetteten Objekt zugeordnet wird, das für nur eine (von vielen) Unterklassen in der Persistenz-ID enthalten sein muss. Ich habe eine neue ID-Klasse erstellt, die es enthält, aber dann bekomme ich den Fehler, dass das Feld zweimal zugeordnet ist. Hier ist ein Beispielcode, der sehr vereinfacht ist, um die Gesundheit des Lesers zu erhalten:
%Vor% Ich habe versucht, @AttributeOverride, aber ich kann nur das Feld umbenennen. Ich habe versucht, es auf update = false, insertable = false zu setzen, aber das schien nicht zu funktionieren, wenn es in der Annotation @AttributeOverride verwendet wurde. Siehe die Antwort unten für die Lösung dieses Problems.
Ich weiß, dass ich die Basisklasse ändern könnte, aber ich möchte das eingebettete Objekt nicht aufteilen, um das gemeinsame Feld zu trennen, da dies den umgebenden Code komplexer machen würde und etwas hässlichen Umbruchcode erfordern würde. Ich könnte das ganze System für diesen Eckfall auch neu entwerfen, aber ich würde wirklich eher nicht.
Ich verwende Hibernate als meinen JPA-Provider.
Ich habe Grund gefunden AttributOverride hat nicht funktioniert. Wenn Sie die Klasse mit Anmerkungen versehen, müssen Sie den Bezeichner des eingebetteten Objekts in das Namensfeld einschließen. Ich habe das gemacht:
%Vor%Wenn es so sein musste:
%Vor%Seltsamerweise hat das Ändern des Namensfelds der @ -Spalte mit der ersten Version funktioniert, aber die einfügbaren und aktualisierbaren Felder wurden ignoriert. Ich weiß nicht, ob das ein Bug oder eine Subtilität der JPA-Spezifikation ist.
Wie auch immer, dies löst, wie das Feld schreibgeschützt gemacht werden kann, aber es beantwortet nicht die ursprüngliche Frage: Ist es möglich, ein Feld aus einem zugeordneten Superklassen-Transient zu machen?