101

注釈付きオブジェクトで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;

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

4

3 に答える 3

178

プロパティがである間、属性mappedByは参照しているため、エラーメッセージが表示されます。したがって、マッピングを次のように変更します。customermCustomer

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

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

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

于 2010-10-25T02:34:41.343 に答える
17

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

あなたが学習の初期の頃の私のようで@OneToMany、''プロパティを持つ注釈を使用するという概念に頭を悩ませている場合、それはまた、注釈をmappedBy保持している反対側がこの双方向の'所有者'であることを意味します関係。@ManyToOne@JoinColumn

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

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

于 2019-05-20T23:57:27.097 に答える
0
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;
}

答えからわかったこと。mappingy = "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と同じである必要があります; そうでない場合は、エラーが発生します。

于 2020-06-06T15:55:12.050 に答える