سؤال

ينشئ تعريف عمود JPA التالي نوع بيانات "عدد صحيح" افتراضيًا في جميع قواعد البيانات (على سبيل المثال.h2، الخلية، بوستجرس)

@Column(name = "type", nullable = false)
@Type(type = "com.mycompany.hibernate.usertype.GenericEnumUserType", parameters = {
        @Parameter(name = "enumClass", value = "com.mycompany.model.DegreeType"),
        @Parameter(name = "identifierMethod", value = "toInt"),
        @Parameter(name = "valueOfMethod", value = "fromInt") })
@NotNull
private DegreeType type;

أرغب في استخدام الحد الأدنى من مساحة التخزين لهذا الحقل، وبالتالي أفضل استخدام المعلمة columnDefinition لإنشاء schema2ddl.ولكن يبدو أن tinyint غير مدعوم في postgres، ولكنه مدعوم في قواعد البيانات الأخرى المذكورة أعلاه.

هل من الممكن إنشاء ملفات SQL مختلفة بناءً على نوع قاعدة البيانات.1.ما هو النهج الأفضل لتحقيق ذلك؟2.ما هو أفضل نوع بيانات (مع الحد الأدنى من التخزين) الذي يمكن استخدامه لهذا الغرض؟هل سيكون ذلك صغيرًا؟

هل كانت مفيدة؟

المحلول

نظرًا لأنك تستخدم نوعًا مخصصًا (لماذا؟)، فسيتم إنشاء تعريف (تعريفات) الأعمدة الأساسية بناءً على نتيجة النوع الخاص بك sqlTypes() طريقة.سيتم الحصول على نوع عمود SQL الفعلي من المناسب Dialect.

وهكذا إذا sqlTypes() كانت للعودة new int[] {Types.TINYINT}, ، ستعين لهجة PostgresQL ذلك int2 وH2/MySQL إلى tinyint.

كل ما قاله، سأفعل عمومًا يوصي:

  1. يستخدم دعم التعداد المدمج عبر @Enumerated حاشية. ملاحظة.
  2. قم بتخزين قيمة التعداد كـ خيط بدلا من عدد صحيح.يؤدي استخدام الأخير إلى توفير بعض المساحة، ولكنه يقدم مشكلة محتملة كبيرة:بعد 3 أشهر (سنوات) يقوم شخص ما بتغيير الكود عن طريق إدخال ثابت تعداد آخر في منتصف النوع الخاص بك وفجأة تصبح جميع بياناتك غير صالحة.مساحة القرص رخيصة؛التعامل مع قضايا مثل هذا ليس كذلك.

    @Enumerated(EnumType.STRING)
    @Column(name = "degree_type", nullable = false, length=!0)
    private DegreeType type;
    
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top