mapsBy参照不明なターゲットエンティティプロパティ


87

注釈付きオブジェクトで1対多の関係を設定する際に問題が発生しています。

私は次のものを持っています:

@MappedSuperclass
public abstract class MappedModel
{
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id",nullable=false,unique=true)
    private Long mId;

その後、これ

@Entity
@Table(name="customer")
public class Customer extends MappedModel implements Serializable
{

    /**
   * 
   */
  private static final long serialVersionUID = -2543425088717298236L;


  /** The collection of stores. */
    @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
  private Collection<Store> stores;

この

@Entity
@Table(name="store")
public class Store extends MappedModel implements Serializable
{

    /**
   * 
   */
  private static final long serialVersionUID = -9017650847571487336L;

  /** many stores have a single customer **/
  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn (name="customer_id",referencedColumnName="id",nullable=false,unique=true)
  private Customer mCustomer;

私はここで何を間違っているのですか

回答:


151

mappedBy属性が参照しているcustomerプロパティがありながらmCustomer、それゆえエラーメッセージが表示されます。したがって、マッピングを次のように変更します。

/** The collection of stores. */
@OneToMany(mappedBy = "mCustomer", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Collection<Store> stores;

または、エンティティプロパティをに変更しますcustomer(これは私が行うことです)。

mapsByリファレンスは、「構成を見つけるために、コレクションを持っているものについて、「customer」という名前のBeanプロパティを調べてください」と示しています。


それが機能したので、プロパティを直接使用するのではなく、リフレクションを使用し、setterまたはgetterメソッドを使用することを期待していました。
boyd4715 2010年

@ boyd4715:ゲッターの注釈を移動して、プロパティアクセス(対フィールドアクセス)を使用したときに何が起こるかを確認できます。一方、のJavadocはmappedBy言う関係を所有しているフィールド、私は、これは何も変更されますかわからないように。
Pascal Thivent 2010年

おかげで私は大いに助けてくれました
Osama Al-Banna 2017

11

@PascalThiventの回答で問題が解決したことはわかっています。このスレッドをサーフィンしているかもしれない他の人への彼の答えにもう少し追加したいと思います。

あなたが学び、使用しての概念の周りにあなたの頭をラップの最初の日に私のようにしている場合@OneToMany「で注釈をmappedBy」他の側が保持していること、それも手段プロパティ@ManyToOneで注釈を@JoinColumnこの双方向の所有者である」を関係。

また、Class変数mappedByインスタンス名mCustomerこの例では)を入力として受け取り、Class-Type(ex:Customer)やエンティティ名(Ex:customer)ではありません。

ボーナス:また、注釈のorphanRemovalプロパティを調べてください@OneToMany。trueに設定されている場合、親が双方向の関係で削除されると、Hibernateはその子を自動的に削除します。


-1
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "USER_ID")
    Long userId;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "sender", cascade = CascadeType.ALL)
    List<Notification> sender;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "receiver", cascade = CascadeType.ALL)
    List<Notification> receiver;
}

public class Notification implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id

    @Column(name = "NOTIFICATION_ID")
    Long notificationId;

    @Column(name = "TEXT")
    String text;

    @Column(name = "ALERT_STATUS")
    @Enumerated(EnumType.STRING)
    AlertStatus alertStatus = AlertStatus.NEW;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "SENDER_ID")
    @JsonIgnore
    User sender;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "RECEIVER_ID")
    @JsonIgnore
    User receiver;
}

答えからわかったこと。mapsy = "sender"の値は、通知モデルで同じである必要があります。例を挙げましょう。

ユーザーモデル:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "**sender**", cascade = CascadeType.ALL)
    List<Notification> sender;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "**receiver**", cascade = CascadeType.ALL)
    List<Notification> receiver;

通知モデル:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "sender", cascade = CascadeType.ALL)
    List<Notification> **sender**;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "receiver", cascade = CascadeType.ALL)
    List<Notification> **receiver**;

ユーザーモデルと通知フィールドに太字を使用しました。ユーザーモデルmappedBy = " sender "は通知リストsenderと同じである必要があり ます; また、mappedBy = " receiver "は通知リストreceiverと同じである必要があり ます。そうでない場合は、エラーが発生します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.