web-dev-qa-db-ja.com

Org.Hibernate.AnnotationException:エンティティに識別子が指定されていませんテーブルにIDがありません

私はデータベース内のテーブルで作業しており、そのテーブルにはプライマリキーまたはプライマリキーとして機能できる一意の値を持つ適切な列がなく、そのテーブルを変更する権限がありません。

私は何をすべきか?ランダムな列に@idアノテーションを付けてみましたが、うまくいきましたが、これが後で問題を引き起こすかどうかはわかりません。私に何ができる?

私のクラス

@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;
}
37
stackUser2000

私はこの問題があり、@ idに間違ったインポートを使用していました:

次のことを確認してください。

import javax.persistence.Id;

ではなく:

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

HibernateはSQLデータベースのアドレス指定の中間体であり、SQLデータベースの各行には一意の識別子が必要なので、Hibernateは強制的に定義します。

自動的に追加される生成された主キーの例を次に示します(ゲッターとセッターを忘れないでください)

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

重複は許可されていないため、任意の列を選択することはできません。

12
ThMBc

JPA(Hibernateではない)では、すべてのエンティティを一意に識別する必要があります。悲しいことに、それはあなたが望むものを許可しません。

一方、JDOを使用すると、永続クラスをPKなしでテーブルにマップでき、必要なものを処理できます。

3
user3973283

また、同じ問題がありました。問題は@Idアノテーションの誤ったインポートでした。したがって、IDに注釈を付けるだけでなく、javax.persistence.Idを使用して注釈を付けるようにしてください。

1
user2389736
You can solve this using embedded id 

例:

@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

Hibernateではない-リレーショナルdatamodelにはprimary keysが必要です。つまり、プライマリキーがないとリレーショナルモデルになり得ないため、破損したデータモデルになります。これがORMでの使用が難しい理由です。

詳細については、 こちら

1
Ankur Singhal

クラスマッピングがreadOnlyマッピングとして使用され、PKまたは@Embeddableを持たない場合は、@Entityの代わりに@EmbeddedKeyアノテーションを使用します

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

}
0
GovindaRaju

各エンティティにp.k制約が定義されていることを確認し、IDアノテーションのインポートステートメントを確認します。インポートステートメントを確認します。

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

@Idアノテーションが付けられたフィールドを指定します。すべての@Entityには@Idが必要です(これはテーブルの主キーです)。解決策は、@ Entityの代わりに@Embeddableを使用することです。その後、@ Idで列に注釈を付ける必要はありません。インポート文をjavax.persistence.Entityから変更します。 javax.persistence.Embeddable;

0
user7420004