0

1) 私は 2 つのテーブル、user と user_profile をOneToOneRelationship で持っています。

ユーザーテーブル:

id,user_name,first_name,last_name - ID には主キーがあり、

ユーザー プロファイル:

id,name,user_id - ID には主キーがあり、user_id にはユーザー テーブルの外部キーがあります

2) 以下は、2 つの JPA Entity オブジェクトです。

ユーザー:

@Entity
@Table(name = "user")
public class User{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;
    @Column(name = "user_name",unique=true,nullable=false)
    private String name;
    @Column(name = "first_name")
    private String firstName;
    @Column(name = "last_name")
    private String lastName;

    @OneToOne(cascade = {CascadeType.ALL})
    @JoinColumn(name="user_id")
    public UserProfile userProfile;

    //with set/get methods
}

ユーザー プロファイル:

@Entity
@Table(name = "user_profile")
public class UserProfile {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;
    @Column(name = "name")
    private String name;
    @Column(name = "user_id")
    private Long userId;

    @OneToOne(mappedBy="userProfile")
    private User user;

    // with set/get methods
}

両方のテーブルに挿入しようとすると、列が値とともに USER テーブルに追加され、USER_PROFILE テーブルuser_idの列に値が表示されません。user_id

私はこのMySQLを初めて使用していますが、これを修正する方法を誰かが明らかにすることができますか?

4

5 に答える 5

0
@OneToOne(cascade = {CascadeType.ALL})
@JoinColumn(name="user_id")
public UserProfile userProfile;

ここでの注釈は、USER テーブルに、USER_PROFILE テーブルへの外部キー参照となる列 USER_ID が含まれることを意味します。それはあなたが期待していたものですか?名前を USER_PROFILE_ID に変更する必要があると思います。

ここでは、他のテーブルの列を指定していないため、次を追加する必要があります。

@JoinColumn(name = "USER_PROFILE_ID", referencedColumnName = "ID")
private UserProfile userProfile;

UserProfile クラスでは、以下を削除できます。

@Column(name = "user_id")
private Long userId;

ユーザーの ID は、USER_PROFILE テーブルの USER 列に表示されます。

于 2013-06-23T06:24:12.153 に答える
0

他の人が述べたよう@JoinColumnに、間違ったテーブルに置かれています。これは、外部キーを含むテーブルである関係の所有側に含める必要があります。あなたの場合、そのテーブルはUserProfile.

ユーザープロフィール

@Entity
@Table(name = "user_profile")
public class UserProfile {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;
    @Column(name = "name")
    private String name;
    @Column(name = "user_id")
    private Long userId;

    @OneToOne(cascade = {CascadeType.ALL})
    @JoinColumn(name="user_id")
    private User user;

    // with set/get methods
}

ユーザー

@Entity
@Table(name = "user")
public class User{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;
    @Column(name = "user_name",unique=true,nullable=false)
    private String name;
    @Column(name = "first_name")
    private String firstName;
    @Column(name = "last_name")
    private String lastName;

    @OneToOne(mappedBy="user")
    public UserProfile userProfile;

    //with set/get methods
}

詳細については、エンティティの所有側の決定に関する私のブログ エントリを参照してください。

于 2013-06-23T08:17:33.140 に答える
0

あなたのマッピングは逆です。@JoinColumn は、userProfile ではなくユーザーにある必要があります。

于 2013-06-23T05:43:09.760 に答える
0

リレーションはone-to-one少し (かなり) 異なって動作しますが、コードは期待していますか? ここで同じことを説明しようとしました: 1 対 1 マッピングの概念。マッピングについて説明します。読んでください。

要点は、one-to-one関連して、DB 設計にいくつかの制限があるということです。リレーションは両方の主キーに基づいています。テーブルのidキー列には、 の列userと同じ値があります。iduser_profile

使用したい場合one-to-oneは、

  • テーブルを変更してくださいuser_profile:
  • idID によって生成されない主キーであるcolumn が含まれます。
  • もう user_id はありません。
  • インスタンスidからNHibernateによって埋められますuser
  • のマッピングはuser_profile、1 対 1 の「スレーブ」マッピングに従う必要があります

user_profile idマッピングの小さなドラフト(ID は ID ではなく「外部」によって生成されます)

// Anottation
@GenericGenerator(name = "generator", strategy = "foreign", 
   parameters = @Parameter(name = "field", value = "user"))
@Id
@GeneratedValue(generator = "generator")
@Column(name = "id", unique = true, nullable = false)
private Long id;

良い例については、こちらをご覧ください: One-to-One example (Annotation)。ここでは、そのようなマッピングを行うためのすべての回答とヒントを見つけることができます。しかし、1 対 1 のマッピングがまさに必要なものかどうかも考えてください。実生活ではちょっと珍しいので…

于 2013-06-23T05:51:13.157 に答える