mappedBy hace referencia a una propiedad de entidad de destino desconocida

85

Tengo un problema al establecer una relación de uno a muchos en mi objeto anotado.

Tengo lo siguiente:

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

luego esto

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

y esto

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

que estoy haciendo incorrecto aqui

boyd4715
fuente

Respuestas:

148

El mappedByatributo hace referencia customermientras que la propiedad lo es mCustomer, de ahí el mensaje de error. Entonces, cambie su mapeo a:

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

O cambie la propiedad de la entidad a customer(que es lo que haría yo).

La referencia mappedBy indica "Revise la propiedad del bean llamada 'cliente' en lo que tengo una colección para encontrar la configuración".

Pascal Thivent
fuente
que funcionó, esperaba que usara la reflexión y el método setter o getter y no la propiedad directamente.
boyd4715
@ boyd4715: podría intentar mover sus anotaciones en los captadores para ver qué sucede cuando se usa el acceso a la propiedad (frente al acceso al campo). Por otro lado, el javadoc de mappedBydice El campo que posee la relación, así que no estoy seguro de que esto cambie nada.
Pascal Thivent
Gracias, eso me ayudó mucho
Osama Al-Banna
9

Sé que la respuesta de @Pascal Thivent ha resuelto el problema. Me gustaría agregar un poco más a su respuesta a otros que podrían estar navegando por este hilo.

Si eres como yo en los primeros días de aprendizaje y entiendes el concepto de usar la @OneToManyanotación con la mappedBypropiedad " ", también significa que el otro lado que sostiene la @ManyToOneanotación con la @JoinColumnes el "propietario" de este bidireccional relación.

Además, mappedBytoma el nombre de la instancia ( mCustomeren este ejemplo) de la variable de clase como entrada y no el tipo de clase (por ejemplo, cliente) o el nombre de la entidad (por ejemplo, cliente).

BONUS: Además, busque en la orphanRemovalpropiedad de @OneToManyanotación. Si se establece en verdadero, entonces si un padre se elimina en una relación bidireccional, Hibernate borra automáticamente sus hijos.

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

Lo que entendí de la respuesta. El valor de mappedy = "sender" debe ser el mismo en el modelo de notificación. Te daré un ejemplo..

Modelo de usuario:

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

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

Modelo de notificación:

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

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

Le di fuente en negrita al modelo de usuario y al campo de notificación. El modelo de usuario mappedBy = " sender " debe ser igual al remitente de la lista de notificaciones ; y mappedBy = " receptor " debe ser igual al receptor de la lista de notificaciones ; Si no, obtendrá un error.

Kumaresan Perumal
fuente