อะไรคือความแตกต่างระหว่าง @JoinColumn และ mappedBy เมื่อใช้การเชื่อมโยง JPA @OneToMany


516

อะไรคือความแตกต่างระหว่าง:

@Entity
public class Company {

    @OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY)
    @JoinColumn(name = "companyIdRef", referencedColumnName = "companyId")
    private List<Branch> branches;
    ...
}

และ

@Entity
public class Company {

    @OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY, mappedBy = "companyIdRef")
    private List<Branch> branches;
    ...
}

1
ดูที่ด้านการเป็นเจ้าของในคำถามการทำแผนที่ ORMสำหรับคำอธิบายที่ดีมากเกี่ยวกับปัญหาที่เกี่ยวข้อง
dirkt

คำตอบ:


545

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

โดยเฉพาะอย่างยิ่งสำหรับรหัสในคำถามคำอธิบายประกอบที่ถูกต้องจะมีลักษณะดังนี้:

@Entity
public class Company {
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "company")
    private List<Branch> branches;
}

@Entity
public class Branch {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "companyId")
    private Company company;
}

3
ในทั้งสองกรณีสาขามีฟิลด์ที่มีรหัส บริษัท
Mykhaylo Adamovych

3
ตาราง บริษัท ไม่มีคอลัมน์ที่มีคีย์ต่างประเทศไปยังตารางที่อ้างอิง - สาขาอ้างถึง บริษัท .. ทำไมคุณถึงพูดว่า "ตารางที่เกี่ยวข้องมีคอลัมน์ที่มีคีย์ต่างประเทศไปยังตารางอ้างอิง" คุณช่วยอธิบายเพิ่มเติมได้ไหม
Mykhaylo Adamovych

13
@ MykhayloAdamovych ฉันได้รับคำตอบของฉันด้วยรหัสตัวอย่าง โปรดสังเกตว่าเป็นความผิดพลาดที่จะใช้@JoinColumnในCompany
ÓscarLópez

10
@ MykhayloAdamovych: ไม่จริงไม่ถูกต้อง หากBranchไม่มีคุณสมบัติที่อ้างอิงCompanyแต่ตารางอ้างอิงนั้นมีคอลัมน์ที่มีอยู่คุณสามารถใช้@JoinTableเพื่อแมปได้ นี่เป็นสถานการณ์ที่ผิดปกติเพราะปกติแล้วคุณจะแมปคอลัมน์ในวัตถุที่ตรงกับตารางของมัน แต่มันสามารถเกิดขึ้นได้และมันถูกต้องตามกฎหมายอย่างสมบูรณ์
ทอมแอนเดอร์สัน

4
นี่เป็นอีกเหตุผลที่ไม่ชอบ ORM เอกสารมักจะหลบเกินไปและในหนังสือของฉันนี่คือคดเคี้ยวในดินแดนเวทย์มนตร์มากเกินไป ฉันได้รับการดิ้นรนกับปัญหานี้และเมื่อติดตามคำต่อคำสำหรับ a @OneToOne, แถวเด็กได้รับการปรับปรุงด้วยnullในคอลัมน์ FKey ของพวกเขาที่อ้างอิงผู้ปกครอง
Ashesh

225

@JoinColumnสามารถใช้ได้ทั้งสองด้านของความสัมพันธ์ คำถามเกี่ยวกับการใช้@JoinColumnที่@OneToManyด้านข้าง (กรณีที่หายาก) และจุดที่นี่อยู่ในการทำสำเนาข้อมูลทางกายภาพ (ชื่อคอลัมน์) พร้อมด้วยแบบสอบถาม SQL ไม่เหมาะที่จะผลิตเพิ่มเติมบางUPDATEงบ

ตามเอกสาร :

เนื่องจากหลายต่อหนึ่งเป็น (เกือบ) เสมอด้านเจ้าของของความสัมพันธ์แบบสองทิศทางในสเปค JPA, การเชื่อมโยงแบบหนึ่งต่อหลายสมาคมมีการเพิ่มความคิดเห็นโดย@OneToMany(mappedBy=...)

@Entity
public class Troop {
    @OneToMany(mappedBy="troop")
    public Set<Soldier> getSoldiers() {
    ...
}

@Entity
public class Soldier {
    @ManyToOne
    @JoinColumn(name="troop_fk")
    public Troop getTroop() {
    ...
} 

Troopมีความสัมพันธ์แบบหนึ่งต่อหลายกับความสัมพันธ์Soldierผ่านคุณสมบัติกองกำลัง คุณไม่จำเป็นต้อง (ต้องไม่) กำหนดการจับคู่ทางกายภาพใด ๆ ในmappedByด้านข้าง

ไปยังแผนที่แบบสองทิศทางหนึ่งไปยังหลายกับด้านใดด้านหนึ่งไปยังหลายเป็นด้านการเป็นเจ้าของคุณจะต้องลบmappedByองค์ประกอบและการตั้งค่าหลายอย่างใดอย่างหนึ่ง@JoinColumnเป็นinsertableและupdatableเป็นเท็จ โซลูชันนี้ไม่ได้รับการปรับให้เหมาะสมและจะจัดทำUPDATEข้อความเพิ่มเติมบางอย่าง

@Entity
public class Troop {
    @OneToMany
    @JoinColumn(name="troop_fk") //we need to duplicate the physical information
    public Set<Soldier> getSoldiers() {
    ...
}

@Entity
public class Soldier {
    @ManyToOne
    @JoinColumn(name="troop_fk", insertable=false, updatable=false)
    public Troop getTroop() {
    ...
}

1
ฉันไม่สามารถระบุได้ว่ากองทหารสามารถเป็นเจ้าของในตัวอย่างที่สองของคุณได้อย่างไรทหารยังคงเป็นเจ้าของเนื่องจากมีรหัสต่างประเทศอ้างอิงถึงกองร้อย (ฉันใช้ mysql ฉันตรวจสอบกับแนวทางของคุณ)
Akhilesh

10
ในตัวอย่างของคุณคำอธิบายประกอบmappedBy="troop"อ้างถึงฟิลด์ใด
Fractaliste

5
@ fractaliste คำอธิบายประกอบmappedBy="troop"หมายถึงกองกำลังของทรัพย์สินในคลาส Soldier ในโค้ดด้านบนคุณสมบัติไม่สามารถมองเห็นได้เพราะที่นี่ Mykhaylo ละเว้นมัน แต่คุณสามารถอนุมานการมีอยู่ของมันโดย getter getTroop () ตรวจสอบคำตอบของÓscarLópezมันชัดเจนมากและคุณจะได้รับคะแนน
nicolimo86

1
ตัวอย่างนี้เป็นการละเมิดข้อกำหนด JPA 2 หากวัตถุประสงค์ของผู้แต่งคือการสร้างความสัมพันธ์แบบสองทิศทางก็ควรใช้ mappedBy ในด้านผู้ปกครองและ JoinColumn (ถ้าจำเป็น) ในด้านเด็ก ด้วยวิธีการนำเสนอที่นี่เราได้รับ 2 ความสัมพันธ์แบบทิศทางเดียว: OneToMany และ ManyToOne ที่เป็นอิสระ แต่เพียงโชค (เพิ่มเติมจากการใช้ผิดวัตถุประสงค์) ความสัมพันธ์ทั้ง 2 นั้นถูกกำหนดโดยใช้คีย์ต่างประเทศเดียวกัน
aurelije

1
หากคุณกำลังใช้ JPA 2.x คำตอบของฉันด้านล่างนั้นสะอาดกว่าเล็กน้อย แม้ว่าฉันจะแนะนำให้ลองทั้งสองเส้นทางและดูว่า Hibernate ทำอะไรเมื่อสร้างตาราง หากคุณอยู่ในโครงการใหม่ให้เลือกรุ่นที่คุณต้องการ หากคุณอยู่ในฐานข้อมูลเดิมและไม่ต้องการเปลี่ยนโครงสร้างให้เลือกรายการใดที่ตรงกับสคีมาของคุณ
Snekse

65

เนื่องจากนี่เป็นคำถามที่พบบ่อยมากฉันจึงเขียน บทความนี้ขึ้นมาซึ่งคำตอบนี้ขึ้นอยู่กับ

การเชื่อมโยงแบบหนึ่งต่อหลายทิศทางแบบทิศทางเดียว

ตามที่ฉันอธิบายในบทความนี้ถ้าคุณใช้@OneToManyคำอธิบายประกอบด้วย@JoinColumnคุณจะมีความสัมพันธ์แบบทิศทางเดียวเช่นเดียวกับPostเอนทิตีระหว่างหน่วยงานหลักและลูกPostCommentในแผนภาพต่อไปนี้:

การเชื่อมโยงแบบหนึ่งต่อหลายทิศทางแบบทิศทางเดียว

เมื่อใช้การเชื่อมโยงแบบหนึ่ง - ต่อ - หลายทิศทางจะมีเพียงการเชื่อมโยงทางด้านปกครองเท่านั้น

ในตัวอย่างนี้เฉพาะPostเอนทิตีที่จะกำหนดความ@OneToManyสัมพันธ์กับPostCommentเอนทิตีรอง:

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "post_id")
private List<PostComment> comments = new ArrayList<>();

การเชื่อมโยงแบบหนึ่งต่อหลายทิศทางแบบสองทิศทาง

หากคุณใช้@OneToManyกับmappedByชุดคุณลักษณะคุณมีการเชื่อมโยงแบบสองทิศทาง ในกรณีของเราPostเอนทิตีทั้งสองมีคอลเลกชันของเอนทิตีของPostCommentเด็กและPostCommentเอนทิตีของเด็กมีการอ้างอิงกลับไปยังPostเอนทิตีหลักดังแสดงในแผนภาพต่อไปนี้:

การเชื่อมโยงแบบหนึ่งต่อหลายทิศทางแบบสองทิศทาง

ในPostCommentเอนทิpostตีคุณสมบัติเอนทิตีถูกแมปดังนี้:

@ManyToOne(fetch = FetchType.LAZY)
private Post post;

เหตุผลที่เราอย่างชัดเจนตั้งค่าfetchแอตทริบิวต์FetchType.LAZYเป็นเพราะโดยค่าเริ่มต้นทั้งหมด@ManyToOneและ@OneToOneสมาคมที่เรียกกระหายซึ่งอาจทำให้เกิดปัญหา N + 1 แบบสอบถาม สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับหัวข้อนี้ตรวจสอบบทความนี้

ในPostเอนทิตีcommentsสมาคมถูกแมปดังนี้:

@OneToMany(
    mappedBy = "post",
    cascade = CascadeType.ALL,
    orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();

mappedByแอตทริบิวต์ของ@OneToManyคำอธิบายประกอบอ้างอิงpostคุณสมบัติในเด็กPostCommentนิติบุคคลและวิธีนี้ Hibernate รู้ว่าสมาคมสองทิศทางถูกควบคุมโดย@ManyToOneด้านข้างซึ่งเป็นค่าใช้จ่ายในการจัดการค่าคอลัมน์ต่างประเทศที่สำคัญความสัมพันธ์ของตารางนี้จะขึ้นอยู่กับ

สำหรับการเชื่อมโยงแบบสองทิศทางคุณต้องมีสองวิธีอรรถประโยชน์เช่นaddChildและremoveChild:

public void addComment(PostComment comment) {
    comments.add(comment);
    comment.setPost(this);
}

public void removeComment(PostComment comment) {
    comments.remove(comment);
    comment.setPost(null);
}

วิธีการทั้งสองนี้ช่วยให้มั่นใจได้ว่าทั้งสองด้านของการเชื่อมโยงแบบสองทิศทางจะไม่ถูกซิงค์ ไฮเบอร์เนตไม่รับประกันว่าการเปลี่ยนแปลงสถานะการเชื่อมโยงจะเผยแพร่ไปยังฐานข้อมูล

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการวัดที่ดีที่สุดในการประสานความสัมพันธ์แบบสองทิศทางกับ JPA และ Hibernate ตรวจสอบบทความนี้

เลือกแบบไหน

การเชื่อมโยงทิศทางเดียว@OneToManyทำงานได้ไม่ดีนักดังนั้นคุณควรหลีกเลี่ยง

คุณจะดีกว่าการใช้แบบสองทิศทาง@OneToManyที่มีประสิทธิภาพมากขึ้น


32

คำอธิบายประกอบmappedByนึกคิดควรจะนำมาใช้ในด้านผู้ปกครอง (ชั้นมหาชน) ของความสัมพันธ์ทิศทางสองในกรณีนี้มันควรจะอยู่ใน บริษัท ชั้นชี้ไปที่สมาชิกตัวแปร 'บริษัท' ของชั้นเรียนเด็ก (ระดับสาขา)

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

ด้านล่างเป็นตัวอย่างการทำงาน:

ระดับผู้ปกครอง บริษัท

@Entity
public class Company {


    private int companyId;
    private String companyName;
    private List<Branch> branches;

    @Id
    @GeneratedValue
    @Column(name="COMPANY_ID")
    public int getCompanyId() {
        return companyId;
    }

    public void setCompanyId(int companyId) {
        this.companyId = companyId;
    }

    @Column(name="COMPANY_NAME")
    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    @OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL,mappedBy="company")
    public List<Branch> getBranches() {
        return branches;
    }

    public void setBranches(List<Branch> branches) {
        this.branches = branches;
    }


}

ชั้นเด็กสาขา

@Entity
public class Branch {

    private int branchId;
    private String branchName;
    private Company company;

    @Id
    @GeneratedValue
    @Column(name="BRANCH_ID")
    public int getBranchId() {
        return branchId;
    }

    public void setBranchId(int branchId) {
        this.branchId = branchId;
    }

    @Column(name="BRANCH_NAME")
    public String getBranchName() {
        return branchName;
    }

    public void setBranchName(String branchName) {
        this.branchName = branchName;
    }

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="COMPANY_ID")
    public Company getCompany() {
        return company;
    }

    public void setCompany(Company company) {
        this.company = company;
    }


}

20

ฉันแค่อยากจะเพิ่ม @JoinColumnไม่เคยมีที่จะเกี่ยวข้องกับข้อมูลสถานที่ทางกายภาพเป็นนี้คำตอบที่แสดงให้เห็น คุณสามารถรวม@JoinColumnกับ@OneToManyแม้ว่าตารางหลักไม่มีข้อมูลตารางที่ชี้ไปที่ตารางย่อย

วิธีกำหนดความสัมพันธ์ OneToMany แบบทิศทางเดียวใน JPA

OneToMany ทิศทางเดียว, ไม่มี Inverse ManyToOne, No Join Table

ดูเหมือนว่าจะมีให้เฉพาะใน JPA 2.x+แม้ว่า มันมีประโยชน์สำหรับสถานการณ์ที่คุณต้องการให้คลาสลูกมี ID ของพาเรนต์ไม่ใช่การอ้างอิงแบบเต็ม


คุณพูดถูกและสนับสนุน OneToMany ที่ไม่มีทิศทางเดียวโดยไม่มีตารางเข้าร่วมจะถูกนำมาใช้ใน JPA2
aurelije

17

ฉันไม่เห็นด้วยกับคำตอบที่ยอมรับโดยÓscarLópez คำตอบนั้นไม่ถูกต้อง!

ไม่ได้@JoinColumnเป็นการระบุว่าเอนทิตีนี้เป็นเจ้าของความสัมพันธ์ แต่มันคือ@ManyToOneคำอธิบายประกอบที่ทำสิ่งนี้ (ในตัวอย่างของเขา)

ความสัมพันธ์คำอธิบายประกอบเช่น@ManyToOne, @OneToManyและ@ManyToManyบอก JPA / Hibernate เพื่อสร้างการทำแผนที่ โดยค่าเริ่มต้นสิ่งนี้จะกระทำผ่านตารางเข้าร่วมแยก


@JoinColumn

วัตถุประสงค์@JoinColumnคือเพื่อสร้างคอลัมน์การเข้าร่วมหากยังไม่มีอยู่ หากเป็นเช่นนั้นคำอธิบายประกอบนี้สามารถใช้ ตั้งชื่อคอลัมน์เข้าร่วม


MappedBy

วัตถุประสงค์ของMappedByพารามิเตอร์คือเพื่อแนะนำ JPA: อย่าสร้างตารางการเข้าร่วมอื่นเนื่องจากความสัมพันธ์นั้นถูกแมปโดยเอนทิตีตรงข้ามของความสัมพันธ์นี้



เตือนความจำ: MappedByเป็นคุณสมบัติของคำอธิบายประกอบความสัมพันธ์ซึ่งมีจุดประสงค์เพื่อสร้างกลไกในการเชื่อมโยงสองเอนทิตีซึ่งโดยค่าเริ่มต้นพวกเขาทำได้โดยการสร้างตารางการเข้าร่วม MappedByหยุดกระบวนการนั้นในทิศทางเดียว

เอนทิตีที่ไม่ได้ใช้MappedByนั้นถูกกล่าวถึงว่าเป็นเจ้าของความสัมพันธ์เนื่องจากกลไกของการทำแผนที่ถูกกำหนดภายในคลาสผ่านการใช้หนึ่งในสามของการทำหมายเหตุประกอบการแมปกับฟิลด์คีย์ต่างประเทศ สิ่งนี้ไม่เพียงระบุลักษณะของการแมป แต่ยังสั่งการสร้างตารางการเข้าร่วม นอกจากนี้ยังมีตัวเลือกในการระงับตารางการเข้าร่วมด้วยการใช้คำอธิบายประกอบ @JoinColumn กับคีย์ต่างประเทศซึ่งเก็บไว้ในตารางของเอนทิตีเจ้าของแทน

ดังนั้นโดยสรุป: @JoinColumnอาจสร้างคอลัมน์เข้าร่วมใหม่หรือเปลี่ยนชื่อคอลัมน์ที่มีอยู่เดิม ในขณะที่MappedByพารามิเตอร์ทำงานร่วมกันกับคำอธิบายประกอบความสัมพันธ์ของคลาสอื่น (เด็ก) เพื่อสร้างการแมปผ่านตารางเข้าร่วมหรือโดยการสร้างคอลัมน์คีย์ต่างประเทศในตารางที่เกี่ยวข้องของหน่วยงานเจ้าของ

เพื่อแสดงวิธีการMapppedByทำงานให้พิจารณารหัสด้านล่าง หากMappedByพารามิเตอร์ถูกลบออกแล้ว Hibernate จะสร้างตารางการเข้าร่วมสองรายการจริง ๆ ! ทำไม? เนื่องจากมีความสมมาตรในความสัมพันธ์แบบหลายต่อหลายคนและไฮเบอร์เนตไม่มีเหตุผลในการเลือกทิศทางหนึ่งไปอีกทิศทางหนึ่ง

ดังนั้นเราใช้MappedByเพื่อบอก Hibernate เราได้เลือกเอนทิตีอื่น ๆเพื่อกำหนดการแมปของความสัมพันธ์ระหว่างสองเอนทิตี

@Entity
public class Driver {
    @ManyToMany(mappedBy = "drivers")
    private List<Cars> cars;
}

@Entity
public class Cars {
    @ManyToMany
    private List<Drivers> drivers;
}

การเพิ่ม @JoinColumn (name = "driverID") ในคลาสเจ้าของ (ดูด้านล่าง) จะป้องกันการสร้างตารางการเข้าร่วมและสร้างคอลัมน์คีย์ foreign foreign ในตาราง Cars เพื่อสร้างการแมป:

@Entity
public class Driver {
    @ManyToMany(mappedBy = "drivers")
    private List<Cars> cars;
}

@Entity
public class Cars {
    @ManyToMany
    @JoinColumn(name = "driverID")
    private List<Drivers> drivers;
}

1

JPA เป็น API แบบเลเยอร์ระดับต่าง ๆ จะมีหมายเหตุประกอบเป็นของตนเอง ระดับสูงสุดคือ (1) ระดับเอนทิตีซึ่งอธิบายคลาสถาวรแล้วคุณมี (2) ระดับฐานข้อมูลเชิงสัมพันธ์ซึ่งถือว่าเอนทิตีถูกแมปไปยังฐานข้อมูลเชิงสัมพันธ์และ (3) โมเดลจาวา

ระดับ 1 คำอธิบายประกอบ: @Entity, @Id, @OneToOne, @OneToMany, ,@ManyToOne @ManyToManyคุณสามารถแนะนำการคงอยู่ในแอปพลิเคชันของคุณโดยใช้คำอธิบายประกอบระดับสูงเหล่านี้เพียงอย่างเดียว แต่คุณต้องสร้างฐานข้อมูลตามสมมติฐานที่ JPA ทำ คำอธิบายประกอบเหล่านี้จะระบุโมเดลเอนทิตี / ความสัมพันธ์

ระดับที่ 2 คำอธิบายประกอบ: @Table, @Column, @JoinColumn... มีอิทธิพลต่อการทำแผนที่จากหน่วยงาน / คุณสมบัติไปยังตารางฐานข้อมูลเชิงสัมพันธ์ / คอลัมน์ถ้าคุณไม่พอใจกับค่าเริ่มต้น JPA หรือหากคุณจำเป็นต้อง map กับฐานข้อมูลที่มีอยู่ คำอธิบายประกอบเหล่านี้สามารถเห็นได้ว่าเป็นคำอธิบายประกอบการนำไปใช้ซึ่งจะระบุวิธีการทำแผนที่

ในความคิดของฉันมันเป็นการดีที่สุดที่จะติดให้มากที่สุดเท่าที่จะเป็นไปได้กับคำอธิบายประกอบระดับสูงแล้วแนะนำคำอธิบายประกอบในระดับที่ต่ำกว่าตามความจำเป็น

ในการตอบคำถาม: @OneToMany/ mappedByเป็นสิ่งที่ดีที่สุดเพราะใช้เพียงหมายเหตุประกอบจากโดเมนเอนทิตี @oneToMany/ @JoinColumnนอกจากนี้ยังดี แต่จะใช้คำอธิบายประกอบการดำเนินงานที่นี้ไม่จำเป็นอย่างเคร่งครัด


1

ขอให้ฉันทำให้มันง่าย
คุณสามารถใช้@JoinColumn ได้ทั้งสองด้านโดยไม่คำนึงถึงการแมป

ลองแบ่งสิ่งนี้ออกเป็นสามกรณี
1) การทำแผนที่ทิศทางเดียวจากสาขาถึง บริษัท
2) การทำแผนที่สองทิศทางจาก บริษัท ไปยังสาขา
3) เฉพาะการทำแผนที่ทิศทางเดียวจาก บริษัท ไปยังสาขา

ดังนั้นกรณีการใช้งานใด ๆ จะอยู่ภายใต้สามหมวดหมู่นี้ ดังนั้นให้ฉันอธิบายวิธีการใช้@JoinColumnและmappedBy
1) การทำแผนที่ทิศทางเดียวจากสาขาถึง บริษัท
ใช้JoinColumnในตารางสาขา
2) การทำแผนที่สองทิศทางจาก บริษัท ไปยังสาขา
ใช้mappedByในตาราง Company ตามคำอธิบายของ @Mykhaylo Adamovych
3) การทำแผนที่ทิศทางเดียวจาก บริษัท ไปยังสาขา
เพียงใช้@JoinColumnในตาราง บริษัท

@Entity
public class Company {

@OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY)
@JoinColumn(name="courseId")
private List<Branch> branches;
...
}

สิ่งนี้บอกว่าตามแผนที่ต่างประเทศ "courseId" ในตารางกิ่งให้ฉันเห็นรายชื่อสาขาทั้งหมด หมายเหตุ: คุณไม่สามารถดึง บริษัท จากสาขาในกรณีนี้มีเฉพาะการแมปทิศทางเดียวจาก บริษัท ไปยังสาขา

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