mappedBy fa riferimento a una proprietà di entità di destinazione sconosciuta


87

Sto riscontrando un problema nell'impostare una relazione uno a molti nel mio oggetto annotato.

Ho il seguente:

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

Poi questo

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

e questo

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

cosa sto facendo di sbagliato qui

Risposte:


151

L' mappedByattributo fa riferimento customermentre la proprietà è mCustomer, quindi il messaggio di errore. Quindi modifica la tua mappatura in:

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

Oppure cambia la proprietà dell'entità in customer(che è quello che farei).

Il riferimento mappedBy indica "Vai a controllare la proprietà del bean denominata 'cliente' sull'oggetto di cui ho una raccolta per trovare la configurazione."


che ha funzionato, mi aspettavo che usasse la riflessione e il metodo setter o getter e non direttamente la proprietà.
boyd4715

@ boyd4715: Potresti provare a spostare le tue annotazioni sui getter per vedere cosa succede quando usi l'accesso alla proprietà (rispetto all'accesso al campo). D'altra parte, il javadoc di mappedBydice Il campo che possiede la relazione, quindi non sono sicuro che questo cambierà nulla.
Pascal Thivent

Grazie che mi aiuta molto
Osama Al-Banna

11

So che la risposta di @Pascal Thivent ha risolto il problema. Vorrei aggiungere un po 'di più alla sua risposta ad altri che potrebbero navigare in questo thread.

Se sei come me nei primi giorni di apprendimento e di avvolgere la testa intorno al concetto di utilizzare l' @OneToManyannotazione con la mappedByproprietà " ", significa anche che l'altro lato che tiene l' @ManyToOneannotazione con il @JoinColumnè il "proprietario" di questo bidirezionale relazione.

Inoltre, mappedByaccetta il nome dell'istanza ( mCustomerin questo esempio) della variabile Class come input e non il tipo di classe (es: cliente) o il nome dell'entità (es: cliente).

BONUS: controlla anche la orphanRemovalproprietà @OneToManydell'annotazione. Se è impostato su true, se un genitore viene eliminato in una relazione bidirezionale, Hibernate elimina automaticamente i suoi figli.


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

Quello che ho capito dalla risposta. mappedy = il valore "mittente" dovrebbe essere lo stesso nel modello di notifica. Ti darò un esempio..

Modello utente:

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

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

Modello di notifica:

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

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

Ho assegnato un carattere in grassetto al modello utente e al campo di notifica. Il modello utente mappedBy = " mittente " deve essere uguale al mittente dell'elenco notifiche ; e mappedBy = " receiver " dovrebbe essere uguale al destinatario della lista di notifica ; In caso contrario, riceverai un errore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.