2012-01-04 9 views
0

データベース同じ主キーとOneToOneとForeignKeyの

*user_account* 
id (PK) 
email 
password 

*user_detail* 
id(PK)(FK) 
name 
city 

エンティティ

@Table(名= "user_detail") パブリッククラスUserDetail implementsSerializable {

@Id private Integer id; 
... 
@OneToOne 
@JoinColumn(name="id") 
private UserAccount userAccount; 

}

@Table(name="user_account") 
public class UserAccount implementsSerializable{ 
    @Id private Integer id; 
    @OneToOne(mappedBy="userAccount") 
    private UserDetail userDetails; 
} 

エラー 例外説明:複数の書き込み可能なマッピング[user_detail.ID]フィールドに存在します。書き込み可能と定義できるのは1つだけです。他はすべて読み取り専用に指定する必要があります。あなたが@Id private Integer id;@JoinColumn(name="id")の両方を持つことはできません

答えて

1

UserAccountのIDが主キーと外部キーの両方である場合は、それを単一フィールドとして宣言して適切にマップする必要があります。このように:

@Entity 
public class UserAccount implements Serializable { 
    @Id 
    @OneToOne(mappedBy="userAccount") 
    private UserDetail userDetails; 
} 

または@MapsIdを使用してください。

@Entity 
@Table(name = "user_account") 
@SecondaryTable(name = "user_detail") 
public class User implements Serializable { 
    @Id 
    private int id; 
    private String email; 
    private String password; 
    @Column(table = "user_detail") 
    private String name; 
    @Column(table = "user_detail") 
    private String city; 
} 
+0

データベースに2つのテーブルを持ち、Entityクラスを1つだけ持つことは理にかなっていますか? – TGM

+0

あなたがやっていることは構図ですので、そうです。実際の質問は次のようなものかもしれません:2つのテーブルを持つことは理にかなっていますか? – Viruzzo

1

、あなたがそれらのいずれかを削除する必要があります。私はあなたが本当に細部に主キーが必要であることを疑うので、そこから@Id行を削除します。

+0

あなたがいない主キーを持つテーブルを使用して示唆している:

しかし、私はあなたが本当にしたいことは二つのテーブルの上に単一のクラスの広がりがあると思われますか? –

+0

いいえ、 'UserDetail'クラスから注釈とフィールドを削除するだけです。とにかくユーザーの詳細は1対1のマッピングで取得されるため、彼はそれを必要としません。 – Viruzzo

+0

ああ、私は参照してください。だからIDなしのエンティティクラスを持っているだろうか?それでも私には間違っているようです。 –

関連する問題