mappedBy อ้างอิงคุณสมบัติของเอนทิตีเป้าหมายที่ไม่รู้จัก


87

ฉันมีปัญหาในการตั้งค่าความสัมพันธ์แบบหนึ่งต่อกลุ่มมากในวัตถุที่มีคำอธิบายประกอบของฉัน

ฉันมีสิ่งต่อไปนี้:

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

ฉันทำอะไรไม่ถูกที่นี่

คำตอบ:


151

mappedByแอตทริบิวต์ที่ถูกอ้างอิงcustomerในขณะที่ทรัพย์สินเป็นmCustomerจึงเกิดข้อผิดพลาด ดังนั้นให้เปลี่ยนการแมปของคุณเป็น:

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

หรือเปลี่ยนคุณสมบัติเอนทิตีเป็นcustomer(ซึ่งเป็นสิ่งที่ฉันจะทำ)

ข้อมูลอ้างอิง mappedBy ระบุว่า "ไปดูคุณสมบัติ bean ที่ชื่อ 'ลูกค้า' ในสิ่งที่ฉันมีคอลเลกชันเพื่อค้นหาการกำหนดค่า"


ที่ได้ผลฉันคาดหวังว่ามันจะใช้การสะท้อนการใช้วิธี setter หรือ getter ไม่ใช่คุณสมบัติโดยตรง
boyd4715

@ boyd4715: คุณสามารถลองย้ายคำอธิบายประกอบของคุณบน getters เพื่อดูว่าจะเกิดอะไรขึ้นเมื่อใช้การเข้าถึงคุณสมบัติ (เทียบกับการเข้าถึงฟิลด์) ในทางกลับกัน javadoc mappedByกล่าวว่าฟิลด์ที่เป็นเจ้าของความสัมพันธ์ดังนั้นฉันไม่แน่ใจว่าสิ่งนี้จะเปลี่ยนแปลงอะไร
Pascal Thivent

ขอบคุณที่ช่วยฉันได้มาก
Osama Al-Banna

11

ฉันรู้คำตอบโดย@Pascal Thiventได้แก้ปัญหานี้แล้ว ฉันอยากจะเพิ่มอีกเล็กน้อยสำหรับคำตอบของเขาสำหรับคนอื่น ๆ ที่อาจจะท่องกระทู้นี้

หากคุณเป็นเหมือนฉันในช่วงแรก ๆ ของการเรียนรู้และการใช้@OneToManyคำอธิบายประกอบกับmappedByคุณสมบัติ '' ก็หมายความว่าอีกด้านหนึ่งถือ@ManyToOneคำอธิบายประกอบด้วย@JoinColumnคือ 'เจ้าของ' ของสองทิศทางนี้ ความสัมพันธ์.

นอกจากนี้ให้mappedByใช้ชื่ออินสแตนซ์ ( mCustomerในตัวอย่างนี้) ของตัวแปรคลาสเป็นอินพุตและไม่ใช่ประเภทคลาส (เช่นลูกค้า) หรือชื่อเอนทิตี (เช่นลูกค้า)

โบนัส: ดูorphanRemovalคุณสมบัติของ@OneToManyคำอธิบายประกอบ หากตั้งค่าเป็นจริงถ้าผู้ปกครองถูกลบในความสัมพันธ์แบบสองทิศทางไฮเบอร์เนตจะลบลูกโดยอัตโนมัติ


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

สิ่งที่ฉันเข้าใจจากคำตอบ 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 = " ผู้รับ " ควรเท่ากับผู้รับแจ้งรายการ ; ถ้าไม่คุณจะได้รับข้อผิดพลาด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.