วันนี้งานของเราคือทำโครงการที่สองในหัวข้อไฮเบอร์เนตให้เสร็จ สาระสำคัญคือการทำความเข้าใจโครงสร้างของฐานข้อมูล แมปเอนทิตีกับตารางที่มีอยู่ และเพิ่มฟังก์ชันการทำงานขั้นต่ำเพื่อตรวจสอบว่าการแมปนั้นถูกต้อง
ตอนนี้ในรายละเอียดเพิ่มเติม:
- ดาวน์โหลดไฟล์ดัมพ์และปรับใช้กับเครื่องของคุณ ในฐานะฐานข้อมูล เราจะใช้ฐานข้อมูลทดสอบซึ่งแจกจ่ายเป็นตัวอย่างพร้อมกับแพ็คเกจการติดตั้ง MySQL จำเป็นต้องมีการถ่ายโอนข้อมูลเพื่อแก้ไขสถานะของฐานข้อมูล เนื่องจากเราไม่สามารถรับประกันได้ว่าจะไม่เปลี่ยนแปลงในหนึ่งวัน เดือน ปี
- เราจะไม่มีเทมเพลตโครงการ ดังนั้นสร้างโครงการด้วยตัวคุณเอง ควรเป็นโครงการ maven ที่มีการพึ่งพาที่จำเป็นทั้งหมด ( hibernate-core-jakarta , mysql-connector-java , p6spy )
- เชื่อมต่อฐานข้อมูลที่ปรับใช้ในพื้นที่ของเราเป็นแหล่งข้อมูลใน Idea หลังจากนั้นในแท็บฐานข้อมูล ให้วางเคอร์เซอร์บนสคีมาภาพยนตร์แล้วกดคีย์ผสม
Alt+Ctrl+Shift+U
(ใช้ได้เฉพาะในเวอร์ชัน Ultimate) นี่จะแสดงโครงสร้างของสคีมาภาพยนตร์ทั้งหมด (พร้อมชื่อคอลัมน์ คีย์ ฯลฯ) มีลักษณะดังนี้:เห็นด้วยค่ะ ไม่ค่อยสบายตา ปิดการแสดงชื่อคอลัมน์และความคิดเห็นทั้งหมด:
ดังนั้น คุณจะได้รับสคีมาฐานข้อมูลที่สามารถวิเคราะห์ได้แล้ว:
- วงจรดูซับซ้อน แต่ไม่ใช่ทุกอย่างจะเลวร้าย ในการวิเคราะห์โครงสร้างของฐานข้อมูล คุณต้องค้นหาตำแหน่งที่จะเริ่มต้น ไม่มีคำตอบที่ถูกต้องแต่ฉันขอแนะนำให้เริ่มต้นด้วย
film
ตาราง ลองใช้ความสัมพันธ์สองสามตัวอย่าง:- ความสัมพันธ์ระหว่างตาราง
film
และfilm_text
เป็น ความสัมพันธ์ แบบ OneToOne ที่ชัดเจน เนื่องจากตารางfilm_text
มีฟิลด์film_id
ที่ไม่อ้างถึงIDจากตารางfilm
(ไม่มีคีย์ต่างประเทศ) แต่ตามชื่อและตรรกะ การเชื่อมต่อนี้ควรจะเป็น นอกจากนี้ ในตาราง ฟิลด์film_text
ยังfilm_id
ทำหน้าที่เป็นคีย์หลัก ซึ่งรับประกันว่า "ภาพยนตร์" หนึ่งเรื่องจะสอดคล้องกับ "ข้อความภาพยนตร์" ไม่เกินหนึ่งรายการ - ทีนี้มาดูตาราง
film
และcategory
ตามเหตุผลแล้ว ภาพยนตร์สามารถมีได้หลายประเภท และหมวดหมู่หนึ่งอาจเป็นภาพยนตร์ที่แตกต่างกันfilm_category
นอกจากนี้ ยังมีตารางเชื่อมโยงระหว่างสองตารางนี้ จากทั้งหมดข้างต้น นี่คือความ สัมพันธ์ ManyToMany ที่ชัดเจน - เราดูตาราง
film
และlanguage
จากมุมมองของตรรกะ ภาพยนตร์อาจมีการแปลเป็นภาษาต่าง ๆ และภาพยนตร์ต่าง ๆ อาจอยู่ในภาษาเดียวกัน นั่นคือManyToMany แนะนำ ตัว เอง แต่ถ้าเราดูเนื้อหาของตารางfilm
เราจะเห็นว่าแต่ละแถวของตารางเป็นภาพยนตร์ที่ไม่ซ้ำกัน และมี ฟิลด์ language_id เพียงฟิลด์เดียวในบรรทัด (มี original_language_id ด้วย แต่ในเร็กคอร์ดทั้งหมดจะเป็นค่าว่าง ดังนั้นเราไม่ต้องสนใจฟิลด์นี้) นั่นคือภาพยนตร์หนึ่งเรื่องสามารถมีได้เพียงภาษาเดียว และภาษาเดียว อาจจะเป็นหนังคนละเรื่องกัน การเชื่อมต่อคือManyToOne (การเชื่อมต่อนั้นกำกับจากภาพยนตร์เป็นภาษาหนึ่ง)
- ความสัมพันธ์ระหว่างตาราง
- ตอนนี้งานหลักคือการสร้างคลาสเอนทิตีที่จำเป็นทั้งหมดและแมปเข้ากับตารางสคี
movie
มา - เพิ่มวิธีการที่สามารถสร้างลูกค้าใหม่ (ตารางลูกค้า) พร้อมฟิลด์ที่ต้องพึ่งพาทั้งหมด อย่าลืมทำวิธีการทำธุรกรรม (เพื่อไม่ให้ตกอยู่ในสถานการณ์ที่มีการบันทึกที่อยู่ของผู้ซื้อในฐานข้อมูล แต่ผู้ซื้อเองไม่ได้)
- เพิ่มวิธีการทำธุรกรรมที่อธิบายเหตุการณ์ "ลูกค้าไปและส่งคืนภาพยนตร์ที่เช่าไปก่อนหน้านี้" เลือกผู้ซื้อและกิจกรรมการเช่าที่คุณต้องการ ไม่จำเป็นต้องคำนวณเรตของภาพยนตร์ใหม่
- เพิ่มวิธีการทำธุรกรรมที่อธิบายเหตุการณ์ “ผู้ซื้อไปที่ร้านค้า (ร้านค้า) และเช่า (เช่า) สินค้าคงคลัง (สินค้าคงคลัง) ที่นั่น ในขณะเดียวกันก็ชำระเงิน (ชำระเงิน) ให้กับผู้ขาย (พนักงาน) ภาพยนตร์ (ผ่านสินค้าคงคลัง) เลือกตามดุลยพินิจของคุณ ข้อจำกัดเดียวคือภาพยนตร์ต้องมีให้เช่า นั่นคือ ไม่ควรมีบันทึกสินค้าคงคลังในการเช่าเลย หรือ คอลัมน์ return_dateของตาราง
rental
สำหรับการเช่าครั้งล่าสุดของสินค้าคงคลังนี้ควรกรอก - เพิ่มวิธีการทำธุรกรรมที่อธิบายเหตุการณ์ "มีการถ่ายทำภาพยนตร์เรื่องใหม่และพร้อมให้เช่า" ภาพยนตร์, ภาษา, นักแสดง, หมวดหมู่ ฯลฯ ให้เลือกตามดุลยพินิจของคุณ
- ไม่สามารถเปลี่ยนโครงสร้างตารางได้ แต่คุณต้องให้คำแนะนำเพื่อการปรับปรุง เราระบุสถานที่ที่มีปัญหาหนึ่งแห่งในย่อหน้าที่ 4 (ไม่มีคีย์ต่างประเทศในตาราง
film_text
บน ฟิลด์film_id
ตารางfilm
) ดูว่ายังมี "ข้อผิดพลาด" ดังกล่าวในโครงสร้างฐานข้อมูลหรือไม่ ถ้าใช่ ให้เพิ่มไฟล์ readme ที่รูทของโปรเจ็กต์และอธิบายข้อผิดพลาดเหล่านี้
การวิเคราะห์โครงการ: