0

検索してみましたが、欲しいものを見つけるのに苦労しました。次のスキーマがあります( * は主キーを示します)

USER
  *UserId
  -Desc
Registration
  *DeviceId
  *UserId
  -date

だから私は登録の主キーを作成したい...

@Embeddable
public class RegPk{
    private String deviceId;
    private User user;
    @Column(name="DEV_ID")
    public String getDevId(){
      return deviceId;
    }
    ...
    @ManyToOne
    @JoinColumn(name="USER_ID", referencedColumnName="USER_ID")
    public User getUser() {
      return user;
    }
    ...
}

これは正しいですか?持続すると、登録時に USER_ID フィールドが適切に更新されますか?

この種のことを試してみると、次のことがわかります....

[10/7/13 13:37:07:156 EDT] 000000ae webapp E com.ibm.ws.webcontainer.webapp.WebApp logServletError SRVE0293E: [サーブレット エラー]-[こんにちは]: org.apache.openjpa.util.MetaDataException : タイプ「class org.me.mfa.jpa.Registration」で指定された ID クラスが、クラスの主キー フィールドと一致しません。ID クラスに、pk フィールド型を含む永続型と同じ主キーがあることを確認してください。一致しないプロパティ: "user"

ならどうしよう?

4

2 に答える 2

1

JPA では、主キー クラスにリレーションシップを含めることはできません。基本型のみです。JPA 2.0 では関係を ID から切り離すことができますが、関係をエンティティ クラスに移動し、RegPk に deviceId と UserId を含めます。デバイスとユーザーの関係は、エンティティ内で @PKClass または @EmbeddedId を使用するかどうかに応じて、@Id または @MapsId("user") でマークされます。pk クラスを使用した例については、http: //wiki.eclipse.org/EclipseLink/Examples/JPA/2.0/DerivedIdentifiers を参照してください。

JPA 1.0 では、(@PrimaryKeyJoinColumn アノテーションを指定するか、@JoinColumn を insertable=false、updatable=false でマークすることによって) デバイスとユーザーの関係が読み取り専用としてマークされることを除いて、同様のセットアップを使用します。次に、主キーの基本マッピング値を手動で設定し、参照されたユーザー エンティティから直接値を取得する必要があります。もちろん、これには User の id が既に割り当てられている必要があり、両方のオブジェクトが新しい場合は追加の作業が必要になる場合があります。

于 2013-10-08T16:45:21.080 に答える
0

エンティティの持続アクションを転送するために注釈に追加cascade = CascadeType.ALLします。@ManyToOneUser

次のようになります。

    ...
    @ManyToOne(optional=true, cascade = CascadeType.ALL)
    @JoinColumn(name="USER_ID", referencedColumnName="USER_ID")
    public User getUser() {
      return user;
    }
    ...

まあ、他にエラーがなければ、うまくいくかもしれません。私は少し混乱してoptional=trueいますが、それは id を提供deviceId,nullできますが、それでも問題ない可能性があります。

于 2013-10-07T15:12:25.303 に答える