ánh xạBằng cách tham chiếu một thuộc tính thực thể mục tiêu không xác định


85

Tôi đang gặp sự cố khi thiết lập mối quan hệ một đến nhiều trong đối tượng được chú thích của mình.

Tôi có những thứ sau:

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

thì đây

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

và điều này

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

tôi đang làm gì sai ở đây

Câu trả lời:


148

Các mappedBythuộc tính được tham chiếu customertrong khi tài sản là mCustomer, vì thế mà thông báo lỗi. Vì vậy, hãy thay đổi ánh xạ của bạn thành:

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

Hoặc thay đổi thuộc tính thực thể thành customer(đó là những gì tôi sẽ làm).

Tham chiếu mappedBy cho biết "Hãy xem qua thuộc tính bean có tên 'khách hàng' trên thứ mà tôi có bộ sưu tập để tìm cấu hình."


đã hoạt động, tôi đã mong đợi nó sử dụng phản chiếu bằng cách sử dụng phương thức setter hoặc getter chứ không phải thuộc tính trực tiếp.
boyd4715

@ boyd4715: Bạn có thể thử di chuyển chú thích của mình trên getters để xem điều gì sẽ xảy ra khi sử dụng quyền truy cập thuộc tính (so với quyền truy cập trường). Mặt khác, javadoc của mappedBycho biết Trường sở hữu mối quan hệ nên tôi không chắc điều này sẽ thay đổi bất cứ điều gì.
Pascal Thivent

Nhờ đó của giúp tôi rất nhiều
Osama Al-Banna

9

Tôi biết câu trả lời của @Pascal Thivent đã giải quyết được vấn đề. Tôi muốn thêm một chút vào câu trả lời của anh ấy cho những người khác có thể đang lướt qua chủ đề này.

Nếu bạn giống như tôi trong những ngày đầu tiên tìm hiểu và xoay quanh khái niệm sử dụng @OneToManychú thích với thuộc tính ' mappedBy', điều đó cũng có nghĩa là phía bên kia giữ @ManyToOnechú thích với thuộc tính @JoinColumnlà 'chủ sở hữu' của thuộc tính hai chiều này. mối quan hệ.

Ngoài ra, mappedBylấy tên cá thể ( mCustomertrong ví dụ này) của biến Lớp làm đầu vào chứ không phải Kiểu-Lớp (ví dụ: Khách hàng) hoặc tên thực thể (Ví dụ: khách hàng).

THƯỞNG: Ngoài ra, hãy xem xét thuộc orphanRemovaltính của @OneToManychú thích. Nếu nó được đặt thành true, thì nếu một phụ huynh bị xóa trong mối quan hệ hai chiều, thì Hibernate sẽ tự động xóa những đứa trẻ đó.


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

Những gì tôi đã hiểu từ câu trả lời. Giá trị mappedy = "sender" phải giống nhau trong mô hình thông báo. Tôi sẽ cho bạn một ví dụ..

Mô hình người dùng:

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

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

Mô hình thông bá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**;

Tôi đã đưa ra phông chữ đậm cho mô hình người dùng và trường thông báo. Mô hình người dùng mappedBy = " sender " phải bằng với người gửi Danh sách thông báo ; và mappedBy = " receiver " phải bằng với người nhận Danh sách thông báo ; Nếu không, bạn sẽ gặp lỗi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.