mappedBy bilinmeyen bir hedef varlık özelliğine başvuruyor


87

Açıklamalı nesnemde bire çok ilişki kurmakta sorun yaşıyorum.

Aşağıdakilere sahibim:

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

sonra bu

@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;

ve bu

@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;

burada neyi yanlış yapıyorum

Yanıtlar:


151

mappedByNitelik başvuran customermülkiyet iken mCustomer, dolayısıyla hata mesajı. Ya eşlemenizi şununla değiştirin:

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

Veya varlık özelliğini olarak değiştirin customer(bunu yapacağım).

MappedBy başvurusu, "Yapılandırmayı bulmak için koleksiyonum olan şeyde 'müşteri' adlı bean özelliğine bakın."


bu işe yaradı, yansımayı kullanmasını ve özelliği doğrudan değil ayarlayıcı veya alıcı yöntemini kullanmasını bekliyordum.
boyd4715

@ boyd4715: Özellik erişimini kullanırken ne olacağını görmek için ek açıklamalarınızı alıcılara taşımayı deneyebilirsiniz (alan erişimine karşı). Öte yandan, Javadoc , ilişkinin sahibi olan alanmappedBy diyor , bu yüzden bunun bir şeyi değiştireceğinden emin değilim.
Pascal Thivent

Teşekkürler bana çok yardımcı oluyor
Usame Al-Banna

11

@Pascal Thivent'in cevabının sorunu çözdüğünü biliyorum . Bu başlıkta gezinen diğerlerine cevabına biraz daha eklemek istiyorum.

@OneToMany' mappedBy' Özelliği ile ek açıklamayı kullanma kavramını öğrenmenin ilk günlerinde benim gibiyseniz ve başınızı ' ' özelliği @ManyToOneile ek açıklamayı tutan diğer tarafın@JoinColumn da bu iki yönlü şeyin 'sahibi' olduğu ilişki.

Ayrıca, mappedBy alır örnek adıyla ( mCustomerbir girdi olarak değil Sınıf değişkenin bu örnekte) Sınıf-Tipi (: Müşteri ex) veya öğe adı (Örn: Müşteri).

BONUS: Ek açıklamanın orphanRemovalözelliğine de bakın @OneToMany. Doğru olarak ayarlanmışsa, çift yönlü bir ilişkide bir ebeveyn silinirse, Hazırda Bekletme otomatik olarak çocuklarını siler.


-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;
}

Cevaptan ne anladım. mappedy = "gönderen" değeri, bildirim modelinde aynı olmalıdır. Sana bir örnek vereceğim..

Kullanıcı modeli:

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

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

Bildirim modeli:

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

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

Kullanıcı modeli ve bildirim alanına kalın yazı tipi verdim. MappedBy = " gönderen " kullanıcı modeli bildirim listesine eşit olmalıdır Gönderen listesi ; ve mappedBy = " alıcı ", bildirim Listesi alıcısına eşit olmalıdır ; Değilse, hata alırsınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.