mappedBy odwołuje się do nieznanej właściwości jednostki docelowej

86

Mam problem z konfiguracją relacji jeden do wielu w moim obiekcie z adnotacjami.

Mam:

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

wtedy to

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

i to

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

co ja tu robię źle

boyd4715
źródło

Odpowiedzi:

149

mappedByAtrybut odwołuje customergdy nieruchomość jest mCustomer, stąd komunikat o błędzie. Więc albo zmień swoje mapowanie na:

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

Lub zmień właściwość jednostki na customer(co bym zrobił).

Odniesienie mappedBy wskazuje, że „Przejrzyj właściwość fasoli o nazwie„ klient ”na rzecz, w której mam kolekcję, aby znaleźć konfigurację”.

Pascal Thivent
źródło
że zadziałało, spodziewałem się, że użyje odbicia i metody ustawiającej lub pobierającej, a nie bezpośrednio właściwości.
boyd4715
@ boyd4715: Możesz spróbować przenieść swoje adnotacje na elementy pobierające, aby zobaczyć, co się dzieje podczas korzystania z dostępu do właściwości (w porównaniu z dostępem do pola). Z drugiej strony javadoc mappedBymówi Pole, które jest właścicielem relacji, więc nie jestem pewien, czy to cokolwiek zmieni.
Pascal Thivent
Dzięki, że bardzo mi pomogło
Osama Al-Banna
9

Wiem, że odpowiedź @Pascal Thivent rozwiązała problem. Chciałbym dodać trochę więcej do jego odpowiedzi dla innych, którzy mogą surfować po tym wątku.

Jeśli jesteś podobny do mnie w początkowych dniach uczenia się i owijania głową wokół koncepcji używania @OneToManyadnotacji z właściwością „ mappedBy”, oznacza to również, że druga strona trzymająca @ManyToOneadnotację z adnotacją @JoinColumnjest „właścicielem” tego dwukierunkowego związek.

Ponadto mappedByprzyjmuje nazwę instancji ( mCustomerw tym przykładzie) zmiennej Class jako dane wejściowe, a nie typ klasy (np. Klient) lub nazwę jednostki (np. Klient).

BONUS: Przyjrzyj się także orphanRemovalwłaściwości @OneToManyadnotacji. Jeśli ma wartość true, to jeśli rodzic zostanie usunięty w relacji dwukierunkowej, Hibernate automatycznie usuwa jego dzieci.

Dhyanesh
źródło
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;
}

Co zrozumiałem z odpowiedzi. mappedy = wartość „nadawca” powinna być taka sama w modelu powiadomienia. Podam ci przykład.

Model użytkownika:

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

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

Model powiadomienia:

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

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

Podałem pogrubioną czcionkę do modelu użytkownika i pola powiadomienia. Model użytkownika mappedBy = " sender " powinien być równy nadawcy listy powiadomień ; a mappedBy = „ receiver ” powinno być równe odbiorcy listy powiadomień ; Jeśli nie, pojawi się błąd.

Kumaresan Perumal
źródło