私は次のエラーを取得するデシベルに私のオブジェクトを保存しようとすると、だから私は私のDBからいくつかのテーブルを設計しそしてリバース:注釈を使用してHibernateで複合キーを表現する方法?
初期のSessionFactory作成failed.org.hibernate.AnnotationException:外部キー参照元のcom.mycodeをcom.mycode.Accountの.Blockのカラム数が正しくありません。スレッド内の2 例外である必要があり、「メイン」java.lang.ExceptionInInitializerError
ドメインオブジェクトは、アカウントオブジェクトの数を含むブロックです:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "Block")
public Set<EAccount> getAccounts() {
return this.Accounts;
}
アカウントは、IDおよびロールの複合キーを持っています。これは個別のクラスでセットアップされています:
@Embeddable
public class BlockAccountId implements java.io.Serializable {
private long blockOid;
private String accountRole;
public BlockAccountId() {
}
public BlockAccountId(long blockOid, String accountRole) {
this.blockOid = blockOid;
this.accountRole = accountRole;
}
@Column(name = "BLOCK_OID", nullable = false)
public long getBlockOid() {
return this.blockOid;
}
public void setBlockOid(long blockOid) {
this.blockOid = blockOid;
}
@Column(name = "ACCOUNT_ROLE", nullable = false, length = 10)
public String getAccountRole() {
return this.accountRole;
}
public void setAccountRole(String accountRole) {
this.accountRole = accountRole;
}
私は知りたいです。テーブルをリンクしてblockOidのアカウントを作成するにはどうすればよいのですか。ただし、アカウントテーブルにblockOidとaccountRoleの両方がコンポジットキーとして設定されていることを確認してください。
例をお待ちしております。
N.Bこれはブロック(1つ)からアカウント(複数)の関係です。
おかげ
感謝。私は実際にこれを元々持っていましたが、Blockオブジェクトに余分な@idを持っていました。その後、エラーメッセージが私を捨てて、それがAccountIdクラス(組み込み複合ID)だと思うようにしました。あなたはどのように冬眠リバースエンジニアのものを見なければならないように見えます。合意の答えをありがとう – Mick
問題はありません! –
すばらしい答え。コンストレインを持たない通常のコンポジットキーでは、コンポジットキーの一部であるフィールドの各ゲッターメソッドに@Idアノテーションを追加するだけでHibernateを満足させることができますので、クラスファイルがどのようにして '実際にデータベースに照会した後にデータベースのメタデータを反映します。もちろん、他のリレーションシップを指定することもできます(例:ManyToOne(...)など)。ただし、すべてがコンポジットキーで、Hibernateにあなたを残したい場合は、それは十分であるはずです。 –