Häufiges Hibernate-Problem: Kein Identifikator für Entity angegeben

Bei der Verwendung von Hibernate kann es vorkommen, dass die Fehlermeldung „AnnotationException: No identifier specified for entity“ auftritt. In unserem aktuellen Blogbeitrag präsentieren wir eine einfache Lösung für dieses häufige Problem.

Beim Ausführen mancher Projekte sto, das einige Entity-Beans enthielt, erhielt ich folgende Fehlermeldung:

Initial SessionFactory creation failed.org.hibernate.AnnotationException: No identifier specified for entity: com.journaldev.hibernate.model.Address
...
Exception in thread "main" java.lang.ExceptionInInitializerError

Ursache des Problems

Dieser Fehler tritt auf, wenn ein Primärschlüssel im Entity-Bean nicht spezifiziert wurde. Ein Beispiel hierfür ist das Bean Address.java, das folgendermaßen definiert war, jedoch ohne die notwendige @Id-Annotation für das Primärschlüsselfeld:

@Entity
@Table(name = "ADDRESS")
@Access(value=AccessType.FIELD)
public class Address {
    // ... Felder ohne @Id Annotation ...
}

Lösung für dieses Hibernate-Problem

Die Lösung besteht darin, die @Id-Annotation zum Primärschlüsselfeld hinzuzufügen:

@Id
@Column(name = "emp_id", unique = true, nullable = false)
@GeneratedValue(generator = "gen")
@GenericGenerator(name = "gen", strategy = "foreign", parameters = {@Parameter(name = "property", value = "employee")})
private long id;

Ein häufiges Missverständnis: Zugriffstypen in Hibernate

Ein weiteres, verwirrendes Szenario entsteht, wenn es um den Zugriffstyp in Hibernate geht. Hibernate kann auf zwei Arten auf Bean-Eigenschaften zugreifen:

  1. Feldzugriff (AccessType.FIELD): Hibernate sucht nach Annotationen auf Variablen.
  2. Eigenschaftszugriff (AccessType.PROPERTY): Hibernate sucht nach Annotationen auf Getter- und Setter-Methoden.

Falls die Annotationen nicht entsprechend dem definierten Zugriffstyp gesetzt sind, führt dies ebenfalls zu einer AnnotationException. Im Employee.java-Bean trat dieser Fehler auf, weil alle JPA-Annotationen auf Getter-Methoden angewendet wurden, obwohl der Zugriffstyp als Feld definiert war. Die Korrektur bestand darin, den Zugriffstyp auf AccessType.PROPERTY zu ändern.

Fazit

Diese Erfahrung verdeutlicht die Bedeutung, die Details und Spezifikationen von Hibernate genau zu kennen und zu beachten. Ein kleines Übersehen oder Missverständnis kann zu stundenlangem Debugging führen. Hoffentlich hilft dieser Beitrag anderen Entwicklern, ähnliche Probleme schnell zu lösen.

Quelle: digitalocean.com

Jetzt 200€ Guthaben sichern

Registrieren Sie sich jetzt in unserer ccloud³ und erhalten Sie 200€ Startguthaben für Ihr Projekt.

Das könnte Sie auch interessieren:

Moderne Hosting Services mit Cloud Server, Managed Server und skalierbarem Cloud Hosting für professionelle IT-Infrastrukturen

IoT-Automatisierung mit MQTT Broker und MongoDB

Databases, Tutorial
Vijona23 Juni um 13:14 Uhr IoT-Automatisierungspipeline mit Coreflux MQTT Broker und MongoDB bereitstellen MQTT-Broker gehören zu den zentralen Bausteinen moderner IoT-Infrastrukturen und Automatisierungsumgebungen. Sie dienen als zentraler, einheitlicher und schneller Datenknotenpunkt,…
Moderne Hosting Services mit Cloud Server, Managed Server und skalierbarem Cloud Hosting für professionelle IT-Infrastrukturen

Coreflux MQTT Broker mit Managed Databases einrichten

Databases, Tutorial
Vijona17 Juni um 10:00 Uhr Coreflux MQTT Broker mit Managed Databases für IoT-Datenverarbeitung bereitstellen MQTT Broker verbinden IoT-Geräte und Anwendungen über ein Publish-Subscribe-Messaging-Modell und sind damit ein zentraler Bestandteil moderner IoT-Infrastrukturen.…
Moderne Hosting Services mit Cloud Server, Managed Server und skalierbarem Cloud Hosting für professionelle IT-Infrastrukturen

Kafka und MongoDB: Echtzeit-Datenpipelines aufbauen

Databases, Tutorial
Vijona16 Juni um 15:09 Uhr So erstellen Sie Echtzeit-Datenpipelines mit Kafka und MongoDB Die Welt verändert sich mit hoher Geschwindigkeit, besonders im Technologiesektor, der Arbeitsabläufe in unterschiedlichsten Branchen und Unternehmen fortlaufend…