mappedBy verweist auf eine unbekannte Zielentitätseigenschaft

86

Ich habe ein Problem beim Einrichten einer Eins-zu-Viele-Beziehung in meinem mit Anmerkungen versehenen Objekt.

Ich habe folgendes:

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

dann das

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

und das

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

Was mache ich hier falsch?

boyd4715
quelle

Antworten:

150

Das mappedByAttribut verweist customerauf die Eigenschaft mCustomer, daher die Fehlermeldung. Ändern Sie also entweder Ihre Zuordnung in:

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

Oder ändern Sie die Entitätseigenschaft in customer(was ich tun würde).

Die mappedBy-Referenz gibt an: "Sehen Sie sich die Bean-Eigenschaft mit dem Namen" customer "an, um die Konfiguration zu finden.

Pascal Thivent
quelle
das funktionierte, ich hatte erwartet, dass es Reflexion verwendet und die Setter- oder Getter-Methode und nicht die Eigenschaft direkt verwendet.
boyd4715
@ boyd4715: Sie könnten versuchen, Ihre Anmerkungen auf den Gettern zu verschieben, um zu sehen, was passiert, wenn Sie den Eigenschaftszugriff verwenden (im Vergleich zum Feldzugriff). Auf der anderen Seite mappedBysagt der Javadoc von Das Feld, dem die Beziehung gehört, also bin ich mir nicht sicher, ob dies irgendetwas ändern wird.
Pascal Thivent
Vielen Dank, das hilft mir sehr
Osama Al-Banna
10

Ich weiß, dass die Antwort von @Pascal Thivent das Problem gelöst hat. Ich möchte seiner Antwort für andere, die möglicherweise in diesem Thread surfen, etwas mehr hinzufügen.

Wenn Sie wie ich in den ersten Tagen des Lernens sind und sich mit dem Konzept der Verwendung der @OneToManyAnnotation mit der mappedByEigenschaft ' ' beschäftigen, bedeutet dies auch, dass die andere Seite, die die @ManyToOneAnnotation mit der Eigenschaft 'hält, @JoinColumnder' Eigentümer 'dieser bidirektionalen Richtung ist Beziehung.

Nimmt auch mappedByden Instanznamen ( mCustomerin diesem Beispiel) der Klassenvariablen als Eingabe und nicht den Klassentyp (Beispiel: Kunde) oder den Entitätsnamen (Beispiel: Kunde).

BONUS: Sehen Sie sich auch die orphanRemovalEigenschaft der @OneToManyAnnotation an. Wenn es auf true gesetzt ist und ein Elternteil in einer bidirektionalen Beziehung gelöscht wird, löscht der Ruhezustand automatisch seine untergeordneten Elemente.

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

Was ich aus der Antwort verstanden habe. mappedy = "Absender" -Wert sollte im Benachrichtigungsmodell identisch sein. Ich werde Ihnen ein Beispiel geben ..

Benutzermodell:

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

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

Benachrichtigungsmodell:

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

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

Ich habe dem Benutzermodell und dem Benachrichtigungsfeld eine fette Schrift gegeben. Benutzermodell mappedBy = " Absender " sollte gleich Absender der Benachrichtigungsliste sein ; und mappedBy = „ Empfänger “ sollte Meldeliste gleich Empfänger ; Wenn nicht, erhalten Sie eine Fehlermeldung.

Kumaresan Perumal
quelle