برنامه نویسی

رابطه نهاد 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:

  1. نهاد مالک: نهادی که با @OneToMany حاشیه نویسی شده است، والد یا نهاد مالک در رابطه است.

  2. نقشه برداری شده توسط: ویژگی mappedBy فیلدی را در موجودیت فرزند مشخص می کند که به موجودیت والد نگاشت می شود. به ایجاد روابط دو طرفه کمک می کند.

  3. آبشاری: ویژگی cascade اجازه می دهد تا عملیاتی مانند تداوم، ادغام یا حذف از والد به موجودیت های فرزند مرتبط منتشر شود.

  4. استراتژی واکشی: مشخصه fetch تعیین می کند که موجودیت های مرتبط مشتاقانه بارگذاری شوند (FetchType.EAGER) یا با تنبلی (FetchType.LAZY).

@ManyToOne

در JPA، @ManyToOne حاشیه نویسی برای تعریف رابطه چند به یک بین دو موجودیت استفاده می شود. این نشان می دهد که بسیاری از نمونه های موجودیت ارجاع دهنده با یک نمونه از موجودیت ارجاع شده مرتبط هستند. این حاشیه نویسی معمولاً برای نشان دادن طرف “خیلی” در یک رابطه استفاده می شود.

ویژگی های کلیدی @ManyToOne:

  1. سمت مالکیت: موجودیت مشروح شده با @ManyToOne طرف مالک رابطه است. این شامل ستون کلید خارجی است که پیوند را ایجاد می کند.
  2. کلید خارجی: حاشیه نویسی @JoinColumn اغلب در کنار @ManyToOne برای تعیین نام ستون کلید خارجی در پایگاه داده استفاده می شود.
  3. آبشاری: ویژگی cascade عملیات آبشاری مانند تداوم، ادغام یا حذف بین موجودیت های مرتبط را فعال می کند.
  4. استراتژی واکشی: مشخصه 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 برای اجرای مهاجرت در تولید استفاده کنید.

پس از اجرای مهاجرت، روابط تعریف شده باید در جداول پایگاه داده مربوطه منعکس شود.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا