web-dev-qa-db-fra.com

mappedBy référence une propriété d'entité cible inconnue

J'ai un problème lors de la configuration d'une relation un à plusieurs dans mon objet annoté.

J'ai les éléments suivants:

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

ensuite ceci

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

et ça

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

qu'est-ce que je fais de mal ici

62
boyd4715

L'attribut mappedBy fait référence à customer tandis que la propriété est mCustomer, d'où le message d'erreur. Donc, changez votre mappage en:

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

Ou changez la propriété de l'entité en customer (ce que je ferais).

La référence mappedBy indique "Allez voir la propriété du bean nommée 'client' sur la chose dont j'ai une collection pour trouver la configuration."

112
Pascal Thivent

Je connais la réponse de @ Pascal Thivent a résolu le problème. Je voudrais ajouter un peu plus à sa réponse à d'autres qui pourraient surfer sur ce fil.

Si vous êtes comme moi dans les premiers jours de l'apprentissage et de la réflexion sur l'utilisation du @OneToMany annotation avec la propriété 'mappedBy', cela signifie également que l'autre côté tenant la @ManyToOne annotation avec le @JoinColumn est le "propriétaire" de cette relation bidirectionnelle.

De plus, mappedBy prend le nom d'instance (mCustomer dans cet exemple) de la variable Class en entrée et pas le Type de classe (ex: Client) ou le nom de l'entité (Ex: client).

BONUS: Consultez également la propriété orphanRemoval de @OneToMany annotation. S'il est défini sur true, si un parent est supprimé dans une relation bidirectionnelle, Hibernate supprime automatiquement ses enfants.

1
Dhyanesh