mapped По ссылке на неизвестное свойство целевой сущности

У меня возникла проблема с установкой отношения "один ко многим" в моем аннотированном объекте.

Имею следующее:

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

тогда это

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

и это

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

что я здесь делаю неправильно


person boyd4715    schedule 25.10.2010    source источник


Ответы (3)


Атрибут mappedBy ссылается на customer, а свойство - mCustomer, отсюда и сообщение об ошибке. Так что либо измените свое отображение на:

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

Или измените свойство entity на customer (что я и сделал бы).

Ссылка mappedBy указывает: «Пройдите по свойству bean-компонента с именем 'customer' на том, что у меня есть в коллекции, чтобы найти конфигурацию».

person Pascal Thivent    schedule 25.10.2010
comment
это сработало, я ожидал, что он будет использовать отражение и использовать метод установки или получения, а не свойство напрямую. - person boyd4715; 25.10.2010
comment
@ boyd4715: Вы можете попробовать переместить свои аннотации в геттеры, чтобы увидеть, что происходит при использовании доступа к свойствам (по сравнению с доступом к полю). С другой стороны, в javadoc mappedBy указано Поле, которому принадлежит связь, поэтому я не уверен, что это что-то изменит. - person Pascal Thivent; 25.10.2010
comment
Спасибо, это мне очень помогло - person Osama Al-Banna; 08.04.2017
comment
Я использовал mappedBy, когда фактическим требованием было joincolumn lol - person 10101010; 26.02.2021
comment
Это то, что действительно непонятно ни из каких примеров, которые я нашел в Интернете. Спасибо, что разъяснили это. - person Steve; 10.06.2021

Я знаю, что ответ @Pascal Thivent решил проблему. Я хотел бы добавить немного больше к его ответу для тех, кто просматривает эту ветку.

Если вы похожи на меня в первые дни обучения и осмысления концепции использования аннотации @OneToMany со свойством 'mappedBy', это также означает, что другая сторона, держащая аннотацию @ManyToOne с @JoinColumn, является 'владельцем' это двунаправленные отношения.

Кроме того, mappedBy принимает в качестве входных данных имя экземпляра (mCustomer в этом примере) переменной Class, а не Class-Type (например: Customer) или имя объекта. (Пример: клиент).

БОНУС: Также обратите внимание на свойство orphanRemoval аннотации @OneToMany. Если для него установлено значение true, то при двунаправленном удалении родительского элемента Hibernate автоматически удаляет его дочерние элементы.

person Dhyanesh    schedule 20.05.2019

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

Что я понял из ответа. Значение mappedy = "sender" должно быть таким же в модели уведомления. Приведу пример ..

Модель пользователя:

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

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

Модель уведомления:

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

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

Я выделил полужирным шрифтом модель пользователя и поле уведомлений. Модель пользователя mappedBy = "sender" должна соответствовать списку уведомлений sender; а mappedBy = "получатель" должен быть равен списку уведомлений получатель; В противном случае вы получите ошибку.

person Kumaresan Perumal    schedule 06.06.2020