رابطه نهاد JPA با داده های Micronaut JDBC

Micronaut چیست
Micronaut یک چارچوب مبتنی بر JVM برای ساخت برنامه های سبک وزن و ماژولار است. Micronaut آخرین چارچوبی است که برای ایجاد سریع و آسان میکروسرویس ها طراحی شده است.
داده های میکروناوت
Micronaut Data یک جعبه ابزار دسترسی به پایگاه داده است که از کامپایل Ahead of Time (AoT) برای پیش محاسبه پرس و جوها برای رابط های مخزن استفاده می کند که سپس توسط یک لایه زمان اجرا نازک و سبک اجرا می شود.
JDBC
Micronaut Data JDBC برای کاربرانی طراحی شده است که تجربه سطح پایین تر و کار مستقیم با SQL را ترجیح می دهند.
شروع سریع
ایجاد یک برنامه کاربردی با CLI
$ mn create-app --lang java example --features data-jdbc,flyway,mysql,jdbc-hikari
برنامه تولید شده دارای یک وابستگی با دامنه کامپایل به ماژول micronaut-data-jdbc خواهد بود و از MySQL استفاده می کند زیرا ویژگی mysql اضافه کردن وابستگی به درایور JDBC برای MySQL را تصویب کردیم:
implementation("io.micronaut.data:micronaut-data-jdbc")
همچنین باید مطمئن شوید که درایور JDBC و وابستگی های استخر اتصال را پیکربندی کرده اید:
runtimeOnly("io.micronaut.sql:micronaut-jdbc-hikari")
پردازشگر حاشیه نویسی باید وابستگی پردازشگر Micronaut Data را به درستی تنظیم کند تا تولید و ارزیابی زمان کامپایل را فعال کند:
annotationProcessor("io.micronaut.data:micronaut-data-processor")
در مرحله بعد باید حداقل یک منبع داده را پیکربندی کنید. قطعه زیر از فایل پیکربندی برنامه نمونه ای از پیکربندی منبع داده پیش فرض JDBC است:
datasources.default.url=jdbc:h2:mem:devDb;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE;NON_KEYWORDS=USER
datasources.default.driverClassName=org.h2.Driver
datasources.default.username=sa
datasources.default.password=
datasources.default.schema-generate=CREATE_DROP
datasources.default.dialect=H2
entity.prefix=demo_
entity.name=Entity1
ما از قابلیت های قوی JPA برای تولید طرحواره SQL با استفاده از موجودیت های JPA در ارتباط با Micronaut Data JDBC استفاده خواهیم کرد.
برای استفاده از حاشیه نویسی JPA در بسته javax.persistence از:
compileOnly("jakarta.persistence:jakarta.persistence-api")
اگر می خواهید از حاشیه نویسی JPA در موجودیت های خود با Micronaut Data JDBC استفاده کنید، ما قویاً توصیه می کنیم از حاشیه نویسی jakarta.persistence استفاده کنید. Micronaut Data پشتیبانی از حاشیه نویسی javax.persistence را در آینده حذف خواهد کرد.
بیایید یک نهاد شغلی با حاشیه نویسی JPA ایجاد کنیم
@AllArgsConstructor
@Setter
@Getter
@Entity
public final class Job {
@Id
@GeneratedValue
private UUID id;
@NotNull
private String title;
@Column(columnDefinition = "TEXT")
private String Description;
@Column(columnDefinition = "TIMESTAMP WITH TIME ZONE")
private Instant startDate;
@Column(columnDefinition = "TIMESTAMP WITH TIME ZONE")
private Instant endDate;
}
ما موجودیت دیگری به عنوان Tag داریم
@AllArgsConstructor
@Setter
@Getter
@Entity
public final class Tag {
@Id
@GeneratedValue
private UUID id;
@NonNull
@NotBlank
@Column(unique = true, length = 255, name = "name")
private String name;
@Column(columnDefinition = "TEXT")
private String description;
}
یک کار را می توان با چندین تگ مرتبط کرد و هر تگ را می توان به چندین کار مرتبط کرد. در نتیجه، رابطه از منظر یک شغل، یک ارتباط یک به چند است (یک شغل میتواند برچسبهای زیادی داشته باشد)، در حالی که از منظر یک برچسب، یک ارتباط یک به چند است (یک برچسب میتواند با بسیاری از مشاغل مرتبط باشد. ).
JPA Hibernate تعریف روابط بین موجودیت ها را با استفاده از حاشیه نویسی JPA تسهیل می کند. ما از این حاشیه نویسی برای ترسیم رابطه بین موجودیت های Job و Tag استفاده خواهیم کرد.
@OneToMany
در JPA، @OneToMany
حاشیه نویسی برای تعریف رابطه یک به چند بین دو موجودیت استفاده می شود. این نشان می دهد که یک موجودیت واحد (طرف “یک”) با چندین نمونه از موجودیت دیگر (طرف “بسیار”) مرتبط است.
ویژگی های کلیدی @OneToMany:
-
نهاد مالک: نهادی که با @OneToMany حاشیه نویسی شده است، والد یا نهاد مالک در رابطه است.
-
نقشه برداری شده توسط: ویژگی mappedBy فیلدی را در موجودیت فرزند مشخص می کند که به موجودیت والد نگاشت می شود. به ایجاد روابط دو طرفه کمک می کند.
-
آبشاری: ویژگی cascade اجازه می دهد تا عملیاتی مانند تداوم، ادغام یا حذف از والد به موجودیت های فرزند مرتبط منتشر شود.
-
استراتژی واکشی: مشخصه fetch تعیین می کند که موجودیت های مرتبط مشتاقانه بارگذاری شوند (FetchType.EAGER) یا با تنبلی (FetchType.LAZY).
@ManyToOne
در JPA، @ManyToOne
حاشیه نویسی برای تعریف رابطه چند به یک بین دو موجودیت استفاده می شود. این نشان می دهد که بسیاری از نمونه های موجودیت ارجاع دهنده با یک نمونه از موجودیت ارجاع شده مرتبط هستند. این حاشیه نویسی معمولاً برای نشان دادن طرف “خیلی” در یک رابطه استفاده می شود.
ویژگی های کلیدی @ManyToOne:
- سمت مالکیت: موجودیت مشروح شده با @ManyToOne طرف مالک رابطه است. این شامل ستون کلید خارجی است که پیوند را ایجاد می کند.
- کلید خارجی: حاشیه نویسی @JoinColumn اغلب در کنار @ManyToOne برای تعیین نام ستون کلید خارجی در پایگاه داده استفاده می شود.
- آبشاری: ویژگی cascade عملیات آبشاری مانند تداوم، ادغام یا حذف بین موجودیت های مرتبط را فعال می کند.
- استراتژی واکشی: مشخصه fetch تعیین می کند که آیا موجودیت مرتبط مشتاقانه بارگذاری شود (FetchType.EAGER) یا با تنبلی (FetchType.LAZY).
بیایید موجودیت دیگری را به عنوان ایجاد کنیم JobTag
برای حفظ روابط بین Job
و Tag
نهادها
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
public final class JobTag extends AuditTrail{
@Id
@GeneratedValue
private UUID id;
}
در ادامه، روابط بین موجودیت ها را تعریف می کنیم. از دیدگاه نهاد Job، یک کار واحد را می توان با چندین برچسب مرتبط کرد. برای نشان دادن این رابطه، ما نهاد شغلی را با استفاده از به روز رسانی می کنیم @OneToMany
حاشیه نویسی JPA.
@AllArgsConstructor
@Builder
@Setter
@Getter
@Entity
public final class Job {
// Other fields
@OneToMany(mappedBy = "job", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
private Collection jobTag = new ArrayList<>();
}
@AllArgsConstructor
@Builder
@Setter
@Getter
@Entity
public final class Tag extends AuditTrail {
// Other properties
@OneToMany(mappedBy = "tag", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
private Collection jobTag = new ArrayList<>();
}
از دیدگاه موجودیت برچسب، یک تگ می تواند با بسیاری از مشاغل مرتبط باشد. برای نشان دادن این رابطه، ما نهاد JobTag را با استفاده از به روز رسانی می کنیم @ManyToOne
حاشیه نویسی JPA.
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
public final class JobTag extends AuditTrail{
@ManyToOne
@JoinColumn(name = "job_id")
private Job job;
@ManyToOne
@JoinColumn(name = "tag_id")
private Tag tag;
}
توصیه می شود از Flyway یا LiquidBase برای اجرای مهاجرت در تولید استفاده کنید.
پس از اجرای مهاجرت، روابط تعریف شده باید در جداول پایگاه داده مربوطه منعکس شود.