私はデータベース内のテーブルで作業しており、そのテーブルにはプライマリキーまたはプライマリキーとして機能できる一意の値を持つ適切な列がなく、そのテーブルを変更する権限がありません。
私は何をすべきか?ランダムな列に@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;
}
私はこの問題があり、@ idに間違ったインポートを使用していました:
次のことを確認してください。
import javax.persistence.Id;
ではなく:
import org.springframework.data.annotation.Id;
HibernateはSQLデータベースのアドレス指定の中間体であり、SQLデータベースの各行には一意の識別子が必要なので、Hibernateは強制的に定義します。
自動的に追加される生成された主キーの例を次に示します(ゲッターとセッターを忘れないでください)
@Id
@GeneratedValue
@Column(name = "id")
private int id;
重複は許可されていないため、任意の列を選択することはできません。
JPA(Hibernateではない)では、すべてのエンティティを一意に識別する必要があります。悲しいことに、それはあなたが望むものを許可しません。
一方、JDOを使用すると、永続クラスをPKなしでテーブルにマップでき、必要なものを処理できます。
また、同じ問題がありました。問題は@Idアノテーションの誤ったインポートでした。したがって、IDに注釈を付けるだけでなく、javax.persistence.Idを使用して注釈を付けるようにしてください。
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
Hibernate
ではない-リレーショナルdatamodel
にはprimary keys
が必要です。つまり、プライマリキーがないとリレーショナルモデルになり得ないため、破損したデータモデルになります。これがORMでの使用が難しい理由です。
詳細については、 こちら
クラスマッピングがreadOnly
マッピングとして使用され、PK
または@Embeddable
を持たない場合は、@Entity
の代わりに@EmbeddedKey
アノテーションを使用します
//@Entity
@Embeddable
@Table(name = "my_table")
public class MyTable implements Serializable {
}
各エンティティにp.k制約が定義されていることを確認し、IDアノテーションのインポートステートメントを確認します。インポートステートメントを確認します。
import javax.persistence.Id;
@Id
@Column(name="id")
@GeneratedValue
private int id;
@Idアノテーションが付けられたフィールドを指定します。すべての@Entityには@Idが必要です(これはテーブルの主キーです)。解決策は、@ Entityの代わりに@Embeddableを使用することです。その後、@ Idで列に注釈を付ける必要はありません。インポート文をjavax.persistence.Entityから変更します。 javax.persistence.Embeddable;