mappedBy посилаючись на невідому властивість цільової сутності


85

У мене виникла проблема з налаштуванням відносин один до багатьох у моєму анотованому об’єкті.

У мене є таке:

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

що я тут роблю неправильно

Відповіді:


148

mappedByАтрибут посилання , customerа властивість mCustomer, отже , повідомлення про помилку. Тож або змініть своє відображення на:

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

Або змінити властивість сутності на customer(що я б і зробив).

Посилання mappedBy вказує "Перейдіть до властивості компонента з ім'ям" клієнт ", щоб знайти конфігурацію речі, з якої я маю колекцію".


що спрацювало, я очікував, що використовуватиме відображення використання методу сеттера або геттера, а не властивості безпосередньо.
boyd4715

@ boyd4715: Ви можете спробувати перемістити свої анотації на геттери, щоб побачити, що відбувається при використанні доступу до властивостей (проти польного доступу). З іншого боку, javadoc of The Field, якому належать стосунки,mappedBy каже, тому я не впевнений, що це щось змінить.
Pascal Thivent

Дякую, це мені дуже допомагає
Усама Аль-Банна

9

Я знаю, що відповідь @Pascal Thivent вирішила проблему. Я хотів би додати трохи більше до його відповіді іншим, хто може серфінгувати цю тему.

Якщо ви подібні до мене в перші дні навчання та обгортання концепції використання @OneToManyанотації із mappedByвластивістю ' ', це також означає, що інша сторона, що тримає @ManyToOneанотацію з, @JoinColumnє "власником" цього двонаправленого відносини.

Крім того, mappedByбере як ім'я екземпляра ( mCustomerу цьому прикладі) змінну Class як вхідні дані, а не Class-Type (наприклад: Customer) або ім'я сутності (Ex: customer).

БОНУС: Також вивчіть orphanRemovalвластивість @OneToManyанотації. Якщо для нього встановлено значення true, то якщо батька видаляють у двонаправлених відносинах, Hibernate автоматично видаляє своїх дітей.


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

Що я зрозумів із відповіді. mappedy = "значення відправника" має бути однаковим у моделі сповіщення. Я наведу вам приклад ..

Модель користувача:

@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 = " відправник " повинна дорівнювати відправнику списку сповіщень ; і mappedBy = " приймач " має дорівнювати списку сповіщень приймача ; Якщо ні, ви отримаєте помилку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.