mappedBy faz referência a uma propriedade de entidade de destino desconhecida

87

Estou tendo um problema em estabelecer uma relação um para muitos em meu objeto anotado.

Eu tenho o seguinte:

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

então isso

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

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

o que estou fazendo de incorreto aqui

boyd4715
fonte

Respostas:

151

O mappedByatributo está referenciando customerenquanto a propriedade é mCustomer, portanto, a mensagem de erro. Portanto, altere seu mapeamento para:

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

Ou altere a propriedade da entidade para customer(que é o que eu faria).

A referência mappedBy indica "Dê uma olhada na propriedade do bean chamada 'cliente' no item que tenho uma coleção para localizar a configuração."

Pascal Thivent
fonte
que funcionou, eu esperava que ele usasse reflexão e use o método setter ou getter e não a propriedade diretamente.
boyd4715,
@ boyd4715: Você pode tentar mover suas anotações nos getters para ver o que acontece ao usar o acesso de propriedade (versus acesso de campo). Por outro lado, o javadoc de mappedBydiz O campo que possui o relacionamento, então não tenho certeza de que isso mudará alguma coisa.
Pascal Thivent,
Obrigado, isso me ajudou muito
Osama Al-Banna
11

Eu sei que a resposta de @Pascal Thivent resolveu o problema. Eu gostaria de acrescentar um pouco mais à sua resposta para outras pessoas que podem estar navegando neste tópico.

Se você for como eu nos primeiros dias de aprendizagem e envolvendo-se no conceito de usar a @OneToManyanotação com a mappedBypropriedade ' ', isso também significa que o outro lado segurando a @ManyToOneanotação com @JoinColumné o 'dono' deste bidirecional relação.

Além disso, mappedByleva o nome da instância ( mCustomerneste exemplo) da variável Class como uma entrada e não o Class-Type (ex: Customer) ou o nome da entidade (Ex: customer).

BÔNUS: Além disso, observe a orphanRemovalpropriedade da @OneToManyanotação. Se for definido como verdadeiro, então se um pai for deletado em um relacionamento bidirecional, o Hibernate deleta automaticamente seus filhos.

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

O que entendi com a resposta. O valor mappedy = "sender" deve ser o mesmo no modelo de notificação. Vou lhe dar um exemplo..

Modelo de usuário:

@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 notificação:

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

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

Eu dei fonte em negrito para o modelo do usuário e campo de notificação Modelo de usuário mappedBy = " remetente " deve ser igual ao remetente da Lista de notificação ; e mappedBy = " receptor " deve ser igual ao receptor da lista de notificações ; Caso contrário, você obterá um erro.

Kumaresan Perumal
fonte