From 27b029e13435bc073ad69f6c6b12ae0315657639 Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Sun, 8 Sep 2024 10:50:43 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D1=83=D0=B1=D0=BB=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B9=20=D0=BF=D1=80=D0=B8=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B8=20?= =?UTF-8?q?@ElementCollection=20=D0=B8=20@OneToMany.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...‡Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΈ использовании @ElementCollection ΠΈ @OneToMany.md | 48 +++++++++++++++++++ meta/zero/00 Hibernate.md | 2 +- 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 dev/java/hibernate/Π”ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΈ использовании @ElementCollection ΠΈ @OneToMany.md diff --git a/dev/java/hibernate/Π”ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΈ использовании @ElementCollection ΠΈ @OneToMany.md b/dev/java/hibernate/Π”ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΈ использовании @ElementCollection ΠΈ @OneToMany.md new file mode 100644 index 00000000..7eb6924c --- /dev/null +++ b/dev/java/hibernate/Π”ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΈ использовании @ElementCollection ΠΈ @OneToMany.md @@ -0,0 +1,48 @@ +--- +aliases: +tags: + - maturity/🌱 +date: + - - 2024-09-06 +zero-link: + - "[[../../../meta/zero/00 Hibernate|00 Hibernate]]" +parents: +linked: +--- +Бтолкнулся с Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌΒ `@ElementCollection`Β Π² связкС с `@OneToMany`. ΠœΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Π²Β `@OneToMany`Β Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΠ·-Π·Π°Β `@ElementCollection`. ΠŸΡ€ΠΎΡ‰Π΅ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. + +Допустим Ρƒ нас Π΅ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹:Β `user`,Β `user_nickname`,Β `address`. Π•ΡΡ‚ΡŒ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒΒ `User`: + +```java +@Entity +public class User { + + // ... ... ... ... ... + + @OneToMany(mappedBy = "user", fetch = FetchType.EAGER) + private List
stages = new ArrayList<>(); + + @ElementCollection(fetch = FetchType.EAGER) + @CollectionTable( + name = "user_nickname", + joinColumns = @JoinColumn(name = "user_id") + ) + @Column(name = "nickname") + private Set nicknames = new HashSet<>(); + + // ... ... ... ... ... + +} +``` + +Допустим Ρƒ нас ΠΎΠ΄Π½Π° запись ΠΏΡ€ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ адрСса ΠΈ ΠΎΠ΄ΠΈΠ½ Π½ΠΈΠΊΠ½Π΅ΠΉΠΌ. Π’ этом случаС всС Ρ…ΠΎΡ€ΠΎΡˆΠΎ, всС ΠΏΡ€ΠΈΠ΄Π΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ. + +==Π”ΠΎΠ±Π°Π²ΠΈΠΌ этому ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π½ΠΈΠΊΠ½Π΅ΠΉΠΌ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡˆΠ΅ΡΡ‚ΡŒ адрСсов ΠΈ Π΄Π²Π° Π½ΠΈΠΊΠ½Π΅ΠΉΠΌΠ°. ΠžΡ‚ΠΊΡƒΠ΄Π° взялись Π΅Ρ‰Π΅ Ρ‚Ρ€ΠΈ Π»ΠΈΡˆΠ½ΠΈΡ… адрСса, Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΡ… всС Π΅Ρ‰Π΅ Ρ‚Ρ€ΠΈ.==Β Π­Ρ‚ΠΎ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚Ρ‹. ΠŸΡ€ΠΈ этом, Ссли Π²Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ΡΡŒ ΠΏΠ°Π³ΠΈΠ½Π°Ρ†ΠΈΠ΅ΠΉ JPA, Ρ‚ΠΎ Π΄ΡƒΠ±Π»Π΅ΠΉ ΡƒΠΆΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. It is magic πŸ’« + +Магии Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, ΠΊΠ°ΠΊ Π²Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅, Π½Π΅Ρ‚. Они ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ использовании `FetchType.EAGER`Β ΡƒΒ `@OneToMany`Β Π² совокупности с `@ElementCollection(fetch = FetchType.EAGER)`. Hibernate Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ запрос с двумя-трСмя ΠΏΠΎΠ»Π½Ρ‹ΠΌΠΈ соСдинСниями, ΠΎΡ‚ΡΡŽΠ΄Π° ΠΈ бСрутся Π΄ΡƒΠ±Π»ΠΈ. ΠŸΡ€ΠΈ этом Π² ΠΏΠ°Π³ΠΈΠ½Π°Ρ†ΠΈΠΈ Hibernate Π½Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄ΠΆΠΎΠΉΠ½Ρ‹, Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΡƒΡ‡Ρƒ сСлСктов, ΠΎΡ‚ΡΡŽΠ΄Π° ΠΈ отсутствиС Π΄ΡƒΠ±Π»Π΅ΠΉ ΠΏΡ€ΠΈ ΠΏΠ°Π³ΠΈΠ½Π°Ρ†ΠΈΠΈ. + +Π­Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ нСсколькими способами: + +- ΠŸΠ΅Ρ€Π΅Π΄Π΅Π»Π°ΠΉΡ‚Π΅Β `List`Β Π²Β `Set`Β ΡƒΒ `@OneToMany`. +- Π£Π±Π΅Ρ€ΠΈΡ‚Π΅Β `FetchType.EAGER`Β ΡƒΒ `@OneToMany`. +- Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅Β `@Fetch(FetchMode.SUBSELECT)`Β ΡƒΒ `@OneToMany`. это аннотация Hibernate, которая вмСсто JOIN ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ подзапрос. О [подзапросах я писал Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅](https://struchkov.dev/blog/ru/select-subquery). \ No newline at end of file diff --git a/meta/zero/00 Hibernate.md b/meta/zero/00 Hibernate.md index 2c0145ed..689f67d0 100644 --- a/meta/zero/00 Hibernate.md +++ b/meta/zero/00 Hibernate.md @@ -5,5 +5,5 @@ tags: - type/zero-link title: Hibernate --- -- [Π”ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΈ использовании @ElementCollection ΠΈ @OneToMany](../../../../_inbox/Π”ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅%20Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ%20ΠΏΡ€ΠΈ%20использовании%20@ElementCollection%20ΠΈ%20@OneToMany.md) +- [Π”ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΈ использовании @ElementCollection ΠΈ @OneToMany](../../dev/java/hibernate/Π”ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅%20Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ%20ΠΏΡ€ΠΈ%20использовании%20@ElementCollection%20ΠΈ%20@OneToMany.md) - [Π›ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ SQL Π² Hibernate](../../dev/java/hibernate/Π›ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅%20SQL%20Π²%20Hibernate.md) \ No newline at end of file