رابطه JPA Manytoon و به استراتژی بپیوندید

JPA (API پایداری جاوا) به شما امکان می دهد وظایف پایگاه داده را بطور عینی پردازش کنید. با این حال ، بسته به رابطه بین نهاد و روش پرس و جو ، ممکن است عملکرد و یکپارچگی داده برنامه بسیار متفاوت باشد.
در این مقاله @ManyToOne
استراتژی پیوستن JPA و @JoinColumn
از nullable
به جلوه های خاصیت در پرس و جو نگاه کنید و روش تنظیم بهینه را ارائه دهید.
1
از طریق کد مثال زیر @ManyToOne
بیایید نگاهی به نحوه ایجاد یک رابطه بپردازیم.
تیمی
@Entity
@Getter @Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString(exclude = "members") // 순환 참조 방지
public class Team {
@Id @GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
private String name;
@OneToMany(mappedBy = "team") // 양방향 관계
private List<Member> members = new ArrayList<>();
// 양방향 관계 편의 메서드
public void addMember(Member member) {
member.setTeam(this);
members.add(member);
}
}
نهاد عضو
@Entity
@Getter @Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString(exclude = "team") // 순환 참조 방지
public class Member {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String username;
@ManyToOne(fetch = FetchType.LAZY) // 지연 로딩
@JoinColumn(name = "TEAM_ID", nullable = false) // NULL 허용 여부 설정
private Team team;
}
Member
موجودیت Team
موجودیت @ManyToOne
رابطه داشته باشید @JoinColumn(name = "TEAM_ID")
از طریق Member
یک ستون کلید خارجی در جدول ایجاد کنید.
2. ویژگی واکشی: بلافاصله بارگیری در مقابل. بارگیری تاخیر
@ManyToOne
حاشیه نویسی fetch
این ملک تصمیم می گیرد که چه زمانی موجودیت مرتبط را به همراه خواهد داشت.
ویژگی واکشی | توضیح | شایستگی | ضرر |
---|---|---|---|
مشتاق |
Member تحقیق Team بلافاصله جستجو کنید |
همه پرس و جو با یک پرس و جو | بارگیری داده های غیر ضروری در دسترس است |
تنبل |
Member تحقیق Team پرس و جو در صورت لزوم |
بهینه سازی عملکرد | پرس و جو اضافی ممکن است رخ دهد (مشکل N+1) |
برای جلوگیری از مشکل N+1 JOIN FETCH
(JPQL) یا @EntityGraph
استفاده از آن خوب است.
3. خصوصیات قابل تهی: NULL اجازه و استراتژی پیوستن
@JoinColumn
از nullable
ویژگی ها مجاز را برای اجازه دادن به تهی ستون کلید سرپایی تنظیم می کنند و بر نوع پرس و جو وصل ایجاد شده توسط JPA تأثیر می گذارند.
دارایی قابل برگشت | توضیح | پیوستن |
---|---|---|
true (پیش فرض) |
ستون کلید سرپایی اجازه می دهد | پیوستن به بیرونی |
false |
ستون کلید سرپایی اجازه تهی نمی کند | پیوستن به داخل |
تغییر در روش پیوستن با توجه به اینکه آیا تهی اجازه می دهد
-
nullable = true
→LEFT OUTER JOIN
استفاده شده (متصلTeam
حتی اگر وجود نداشته باشدMember
استعلام) -
nullable = false
→INNER JOIN
استفاده شده (متصلTeam
نابرابMember
پرسیده نمی شود)
اتصال داخلی اغلب سودمندتر از Left Left Lefter است.
4.
EAGER + NULLABLE = TRUE (پیوستن به بیرونی چپ)
SELECT m.MEMBER_ID, t.TEAM_ID, t.name, m.username
FROM Member m
LEFT JOIN Team t ON t.TEAM_ID = m.TEAM_ID
WHERE m.MEMBER_ID = ?;
Eage + nullable = false (inner join)
SELECT m.MEMBER_ID, m.TEAM_ID, t.TEAM_ID, t.name, m.username
FROM Member m
JOIN Team t ON t.TEAM_ID = m.TEAM_ID
WHERE m.MEMBER_ID = ?;
تنبل (بدون عضویت ، پرس و جو اضافی رخ می دهد)
-- Member 조회 (Team 조인 없음)
SELECT m.MEMBER_ID, m.TEAM_ID, m.username
FROM Member m
WHERE m.MEMBER_ID = ?;
-- findMember.getTeam().getName() 호출 시 추가 쿼리 실행
SELECT t.TEAM_ID, t.name
FROM Team t
WHERE t.TEAM_ID = ?;
em.getReference(Team.class, id)
با استفاده از یک شیء پروکسی باز می گردد.
5. راهنمای انتخاب بهینه
✅ برای حفظ یکپارچگی داده ها:
-
nullable = false
(هرMember
لزوماًTeam
باید متعلق باشد) -
INNER JOIN
عملکرد را می توان از طریق
✅ اگر می خواهید بهینه سازی عملکرد:
-
FetchType.LAZY
استفاده (بارگیری داده های غیر ضروری) - در صورت لزوم
JOIN FETCH(JPQL)
یا@EntityGraph
ترکیب
✅ اگر به یک مدل داده انعطاف پذیر نیاز دارید:
-
nullable = true
(غیر منتظرهMember
مجاز) -
LEFT OUTER JOIN
با استفاده از از دست دادن داده ها جلوگیری کنید
✅ در صورت نیاز به شناسه:
-
em.getReference()
استفاده (پیشگیری از تحقیق غیر ضروری)
پایان
استفاده صحیح از استراتژی پیوستن JPA و محدودیت های تهی می تواند عملکرد و یکپارچگی داده برنامه را همزمان تضمین کند.
مهم است که با در نظر گرفتن مدل داده و الزامات عملکرد مورد نیاز پروژه ، تنظیم بهینه را انتخاب کنید.