Vererbung id automatisch für child generieren

Hallo,

ich hab folgende abstracte Klasse:

@MappedSuperclass
public abstract class AbstractEntity{
	
	@Id
	private int id;
	
	/**
	 * @return the id
	 */
	public int getId() {
		return id;
	}
	
	/**
	 * @param id the id to set
	 */
	public void setId(int id) {
		this.id = id;
	}
	
	public abstract void parse(JSONObject jsonData);
}

Von dieser Klasse erben 8 Entitäten. Bei jeder dieser Entitäten ist die id der Oberklasse der Primärschlüssel. Genau so soll es auch sein. Nun will ich das die ID für eine der 8 Klassen automatisch generiert wird. Wenn ich aber nun in der Abstrakten klasse @GeneratedValue setze werden natürlich die IDs für alle 8 Klassen automatisch generiert. Das will ich nicht.

Gibt es eine möglichkeit in der Kindklasse eine Annotation zu setzen, sodass nur für sie die ID automatisch generiert wird?

Gruß
Cromm Cruach

Nein das geht so nicht. Zumindest nicht über Annotationen.

Ich würde vorschlagen von unter AbstractEntity eine weitere Ebene hinzuzufügen:

GeneretedIdEntity, IdEntity

Dann erbt eine von Generted und alle andere von Id Entity.

In Abstract Entity kannst du die Methoden getId() als abstract implementieren, dann solltest du keine Nachteile haben.

Und wo set ich in der Generated dann die Annotation für @GeneradedValue?! Kann in der Generaded Absract ja nicht nochmal ein feld int id mit @id und @Generadet Value anlegen?!

Ja doch,

in der Abstract Entity wäre es ja nicht mehr da.

Aso also einfach 2 Abstrakte klassen von einer erben 7 und von der anderen eine?!

Jo genau.

Wobei getter und Setter für id werden von Entity vorgegeben.

Aber die Ausprägung von ID sind halt anders.

Alles klar Danke :slight_smile:

Das ganze geht auch ohne Zwischenklasse mit folgender Änderung:
Steige von Field-Based Mapping (Annotationen über den Feldern) auf Getter-Based Mapping (Annotationen über den Gettern) um. In der AbstractEntity hast Du weiterhin die @Id-Annotation, jetzt aber über dem Getter. In der Klasse, wo die Id generiert werden soll, fügst Du dann den @GeneratedValue hinzu. Getter-Based Mapping wäre sowieso meine Empfehlung. Und dann noch was: Nimm gerade für die id (und im Prinzip auch fast immmer) keine Primitives, sondern die nullable Wrapper-Typen (hier also Integer). Es ist klar, dass die Id NOT NULL ist, deswegen denkt man als Java-Programmierer “kann ich ja int nehmen”. Tatsächlich wird die Id aber i.d.R. erst gesetzt, wenn die Entity in der DB gespeichert wurde. Die ORM-Frameworks können damit erkennen, ob eine Entity schon gespeichert wurde oder nicht.