web-dev-qa-db-de.com

Org.Hibernate.AnnotationException: Kein Identifier für Entity angegeben

Ich arbeite mit einer Tabelle in einer Datenbank, und diese Tabelle hat keinen Primärschlüssel oder keine richtige Spalte mit einem eindeutigen Wert, der als Primärschlüssel fungieren kann. Ich habe keine Berechtigung zum Ändern dieser Tabelle.

Was soll ich machen? Ich habe versucht, eine @id-Annotation in eine zufällige Spalte zu schreiben, und es hat funktioniert, aber ich weiß nicht, ob dies später Probleme bereiten wird. was kann ich machen?

Meine Klasse

@Entity
@Table(name="my_table")
public class TheTable {
@Column (name="name", nullable=false)
    private String name;

    @Id <--- I just put this id in this random column but this column should not be a id column
    @Column (name="anyfield", nullable=false)
    private String anyfield;
}
36
stackUser2000

Ich hatte dieses Problem und verwendete den falschen Import für @id:

Stellen Sie sicher, dass es:

import javax.persistence.Id;

und nicht:

import org.springframework.data.annotation.Id;
125
Cory Roy

Der Ruhezustand ist ein Zwischenprodukt für die Adressierung von SQL-Datenbanken. Da jede Zeile in einer SQL-Datenbank einen eindeutigen Bezeichner haben sollte, zwingt der Ruhezustand Sie dazu, einen zu definieren.

Hier ist ein Beispiel eines generierten Primärschlüssels, der automatisch hinzugefügt wird (Getter und Setter nicht vergessen)

@Id 
@GeneratedValue
@Column(name = "id")
private int id;

Da Duplikate nicht zulässig sind, ist die Auswahl einer beliebigen Spalte nicht der richtige Weg.

12
ThMBc

JPA (nicht Hibernate als solcher) erfordert, dass alle Entitäten eindeutig identifiziert werden. Leider lässt es nicht zu, was Sie wollen.

JDO hingegen erlaubt einer persistenten Klasse die Zuordnung zu einer Tabelle ohne PK und würde damit umgehen, was Sie benötigen.

3
Billy Frost

Hatte auch das gleiche Problem. Das Problem war ein falscher Import der @Id-Anmerkung. Stellen Sie daher sicher, dass Sie die ID nicht nur mit Anmerkungen versehen, sondern auch mit javax.persistence.ID.

1
user2389736
You can solve this using embedded id 

ex:

@Entity
@Table(name = "my_table")
public class MyTable implements Serializable {

    private static final long serialVersionUID = 1L;

    // @Id
    @Column(name = "id", insertable = false, updatable = false)
    private String id;

    @EmbeddedId
    MYtablePK pk;

    public MYtablePK getPk() {
        return pk;
    }

    public void setPk(MYtablePK pk) {
        this.pk = pk;
    }

    @Column(name = "my_table_FirstName", insertable = false, updatable = false)
    private String name;

    @Transient
    public String getName() {
        return pk.getName();
    }

    public void setName(String mrn) {
        pk.setName(name);
    }
    @Transient
        public String getSeverity() {
        return pk.getSeverity();
    }
    public void setSeverity(String severity) {
        pk.setName(name);
    }

    public String getId() {
        return pk.getId();
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return pk.getName();
    }
    public void setName(String name) {
        tpk.setName(name);
    }
}

@Embeddable
public class MyTablePK implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = -1257821517891392898L;
    @Column(name = "id")
    private String id;
    @Column(name = "name")
    private String name;
    @Column(name = "dob")
    private Date dob;
    public Date getdob() {
        return dob;
    }
    public void setdob(Date dob) {
        this.pk.setdob(dob);
    }
    @Column(name = "severity")
    private String severity;
    public String getSeverity() {
        return severity;
    }
    public void setSeverity(String severity) {
        this.severity = severity;
    }

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name
1

Es ist nicht gerade Hibernate - eine relationale datamodel erfordert primary keys. Sie haben also ein defektes Datenmodell, denn ohne Primärschlüssel kann es nicht relational sein, weshalb es schwierig ist, es mit einem ORM zu verwenden. 

für mehr Infos, hier

1
Ankur Singhal

Verwenden @Embeddable Anmerkung statt @Entity wenn Ihre Klassenzuordnung als readOnly Zuordnung verwendet wird und keine PK oder @EmbeddedKey

//@Entity
@Embeddable
@Table(name = "my_table")
public class MyTable implements Serializable {

}
0
GovindaRaju

Stellen Sie sicher, dass für jede Entität eine p.k-Einschränkung definiert ist, und überprüfen Sie die Importanweisung für Id Annotation . Check Import-Anweisung:

import javax.persistence.Id;
@Id
@Column(name="id")
@GeneratedValue 
private int id;
0
Shivalik Chopra

Geben Sie ein mit @Id kommentiertes Feld an. Jede @Entity erfordert eine @Id (Dies ist der Primärschlüssel in der Tabelle.) . Die Lösung für Sie besteht darin, @Embeddable anstelle von @Entity zu verwenden. In diesem Fall müssen Sie keine Spalte mit @Id kommentieren. Ändern Sie die Importanweisung von javax.persistence.Entity. javax.persistence.Embeddable; 

0
user7420004