web-dev-qa-db-fra.com

Org.Hibernate.AnnotationException: aucun identifiant spécifié pour l'entité Je n'ai pas d'identifiant dans ma table

Je travaille avec une table dans une base de données et cette table n'a pas de clé primaire ni de colonne appropriée avec une valeur unique pouvant agir en tant que clé primaire, je n'ai pas l'autorisation de modifier cette table.

Que devrais-je faire? J'ai essayé de mettre une annotation @id dans une colonne aléatoire et cela a fonctionné, mais je ne sais pas si cela apportera des problèmes plus tard. Que puis-je faire?

Ma classe

@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

J'ai eu ce problème et j'utilisais la mauvaise importation pour @id:

Assurez-vous que c'est:

import javax.persistence.Id;

et pas:

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

Hibernate est un intermédiaire permettant d'adresser des bases de données SQL, et comme chaque ligne d'une base de données SQL doit avoir un identifiant unique, il vous oblige à en définir un.

Voici un exemple de clé primaire générée, qui sera ajoutée automatiquement (n'oubliez pas le getter et le setter)

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

Étant donné que les doublons ne sont pas autorisés, le choix d'une colonne arbitraire n'est pas la solution.

12
ThMBc

JPA (pas Hibernate en tant que tel) exige que toutes les entités soient identifiées de manière unique. Malheureusement, cela ne permet pas ce que vous voulez.

JDO, en revanche, permet à une classe persistante de mapper vers une table sans PK et traitera ce dont vous avez besoin.

3
Billy Frost

Aussi eu le même problème. Le problème était une mauvaise importation de l'annotation @Id. Assurez-vous donc non seulement d'annoter l'ID mais également de le faire avec 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
Manisha Srivastava

Ce n'est pas une variable Hibernate - une relationnelle datamodel nécessite primary keys. Donc, ce que vous avez est un modèle de données cassé car sans clé primaire, il ne peut pas être relationnel, et c'est pourquoi il est difficile à utiliser avec un ORM. 

pour plus d'informations, ici

1
Ankur Singhal

Assurez-vous que la contrainte p.k est définie pour chaque entité et vérifiez l’instruction d’importation pour Id Annotation . Vérifiez l’instruction Importation:

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

Spécifiez un champ annoté avec @Id. Chaque @Entity nécessite un @ Id (c'est la clé primaire de la table) . La solution pour vous consiste à utiliser @ Embeddable au lieu de @Entity. Modifiez l'instruction d'importation de javax.persistence.Entity; javax.persistence.Embeddable; 

0
user7420004