سؤال

لدي قاعدة بيانات موجودة من فيلم نظام الإيجار.كل فيلم له لديها تصنيف السمة.في SQL كانوا عائقا أمام تحد القيم المسموح بها من هذه السمة.

CONSTRAINT film_rating_check CHECK 
    ((((((((rating)::text = ''::text) OR 
          ((rating)::text = 'G'::text)) OR 
          ((rating)::text = 'PG'::text)) OR 
          ((rating)::text = 'PG-13'::text)) OR 
          ((rating)::text = 'R'::text)) OR 
          ((rating)::text = 'NC-17'::text)))

أعتقد أنه سيكون من الجميل أن استخدام جافا التعداد إلى خريطة القيد في وجوه العالم.ولكن ليس من الممكن ببساطة تأخذ القيم المسموح بها بسبب شار خاص في "PG-13" و "NC-17".لذا نفذت التالية التعداد:

public enum Rating {

    UNRATED ( "" ),
    G ( "G" ), 
    PG ( "PG" ),
    PG13 ( "PG-13" ),
    R ( "R" ),
    NC17 ( "NC-17" );

    private String rating;

    private Rating(String rating) {
        this.rating = rating;
    }

    @Override
    public String toString() {
        return rating;
    }
}

@Entity
public class Film {
    ..
    @Enumerated(EnumType.STRING)
    private Rating rating;
    ..

مع toString() اتجاه enum -> String يعمل بشكل جيد ، ولكن سلسلة -> enum لا يعمل.أحصل على الاستثناء التالي:

[TopLink تحذير]:2008.12.09 01:30:57.434--ServerSession(4729123)--استثناء [TOPLINK-116] (Oracle TopLink أساسيات - 2.0.1 (بناء b09d-fcs (12/06/2007))):أوراكل.toplink.الضروريات.الاستثناءات.DescriptorException استثناء وصف:لا قيمة التحويل المنصوص عليها القيمة [NC-17] في المجال [الفيلم.التصنيف].الخرائط:أوراكل.toplink.الضروريات.تعيينات.DirectToFieldMapping[تصنيف-->الفيلم.التصنيف] واصف:RelationalDescriptor(دي.fhw.nsdb.الكيانات.الفيلم --> [DatabaseTable(فيلم)])

هتافات

تيمو

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

المحلول

ويبدو أنك بحاجة إلى إضافة دعم لنوع مخصص:

توسيع يقوم OracleAS TopLink لدعم مخصص نوع التحويلات

نصائح أخرى

هل حاولت لتخزين قيمة ترتيبي. تخزين سلسلة القيمة يعمل بشكل جيد إذا لم يكن لديك سلسلة يرتبط إلى القيمة:

@Enumerated(EnumType.ORDINAL)

لديك مشكلة هنا هو قدرات محدودة JPA عندما يتعلق الأمر بالتعامل مع enums.مع enums لديك خيارين:

  1. تخزينها عدد تعادل Enum.ordinal(), الذي هو فكرة رهيبة (imho);أو
  2. تخزينها كسلسلة يعادل Enum.name(). ملاحظة: لا toString() كما قد تتوقع, خصوصا الافتراضي behaviourfor Enum.toString() هو العودة name().

شخصيا أعتقد أن أفضل خيار هو (2).

الآن لديك مشكلة في انك تحدد القيم التي لا تمثل vailid سبيل المثال أسماء في جافا (أي باستخدام واصلة).حتى الاختيارات الخاصة بك:

  • تغيير البيانات الخاصة بك ؛
  • تستمر سلسلة الحقول ضمنا تحويلها إلى أو من enums في الكائنات ؛ أو
  • استخدام غير قياسي امتداد مثل TypeConverters.

وأود أن نفعل لهم في هذا النظام (أول الماضي) كما أمر تفضيل.

اقترح شخص ما أوراكل TopLink هو تحويل ولكن ربما كنت تستخدم Toplink الضروريات ، كونها مرجعية JPA 1.0 التنفيذ ، وهي مجموعة فرعية من التجاري أوراكل Toplink المنتج.

كما اقتراح آخر ، أود أن نوصي بشدة التحول إلى EclipseLink.بل هو أكثر بكثير من التنفيذ الكامل من Toplink أساسيات Eclipselink سيكون المرجع تنفيذ JPA 2.0 عندما صدر (يتوقع JavaOne منتصف العام المقبل).

public enum Rating {

    UNRATED ( "" ),
    G ( "G" ), 
    PG ( "PG" ),
    PG13 ( "PG-13" ),
    R ( "R" ),
    NC17 ( "NC-17" );

    private String rating;

    private static Map<String, Rating> ratings = new HashMap<String, Rating>();
    static {
        for (Rating r : EnumSet.allOf(Rating.class)) {
            ratings.put(r.toString(), r);
        }
    }

    private static Rating getRating(String rating) {
        return ratings.get(rating);
    }

    private Rating(String rating) {
        this.rating = rating;
    }

    @Override
    public String toString() {
        return rating;
    }
}

وأنا لا أعرف كيفية القيام تعيينات في الجانب TopLink المشروح من الأشياء ولكن.

وأنا لا أعرف الداخلية لtoplink، ولكن تخميني المتعلمين هو ما يلي: فهو يستخدم الأسلوب Rating.valueOf (سلسلة ق) لتعيين في الاتجاه الآخر. ليس من الممكن لتجاوز valueOf ()، لذلك يجب التمسك اصطلاح تسمية جافا، للسماح طريقة valueOf الصحيح.

public enum Rating {

    UNRATED,
    G, 
    PG,
    PG_13 ,
    R ,
    NC_17 ;

    public String getRating() {
        return name().replace("_","-");;
    }
}

وgetRating تنتج "الإنسان للقراءة" التصنيف. لاحظ أن "-" لا يسمح chanracter في معرف التعداد

وبالطبع سيكون لديك لتخزين القيم في DB كما NC_17.

المشكلة أنني أعتقد أن JPA لم تدشينها مع فكرة في الاعتبار أننا يمكن أن يكون المعقدة الموجودة مسبقا المخطط بالفعل في المكان.

أعتقد أن هناك نوعان من القصور الرئيسية الناتجة عن هذه محددة إلى التعداد:

  1. الحد من استخدام اسم() الترتيبية().لماذا لا مجرد علامة جالبة مع @Id, طريقة عملنا مع @الكيان ؟
  2. التعداد هو عادة تمثيل في قاعدة البيانات للسماح بالتعاون مع جميع أنواع البيانات ، بما في ذلك إسم اسم وصفي ربما شيء مع التعريب.... الخنحن بحاجة سهلة الاستخدام من التعداد جنبا إلى جنب مع مرونة كيان.

مساعدة بلدي سبب التصويت على JPA_SPEC-47

وماذا عن هذا

public String getRating{  
   return rating.toString();
}

pubic void setRating(String rating){  
   //parse rating string to rating enum
   //JPA will use this getter to set the values when getting data from DB   
}  

@Transient  
public Rating getRatingValue(){  
   return rating;
}

@Transient  
public Rating setRatingValue(Rating rating){  
   this.rating = rating;
}

ومع هذا يمكنك استخدام تصنيفات مثل String على حد سواء DB وكيان، ولكن استخدام التعداد لشيء آخر.

استخدم هذا الشرح

@Column(columnDefinition="ENUM('User', 'Admin')")

والتعداد التعداد العام ParentalControlLevelsEnum {     U ( "U")، PG ( "PG")، _12 ( "12")، _15 ( "15")، _18 ( "18")؛

private final String value;

ParentalControlLevelsEnum(final String value) {
    this.value = value;
}

public String getValue() {
    return value;
}

public static ParentalControlLevelsEnum fromString(final String value) {
    for (ParentalControlLevelsEnum level : ParentalControlLevelsEnum.values()) {
        if (level.getValue().equalsIgnoreCase(value)) {
            return level;
        }
    }
    return null;
}

و}

ومقارنة -> التعداد

والطبقة العامة RatingComparator تنفذ المقارنة {

public int compare(final ParentalControlLevelsEnum o1, final ParentalControlLevelsEnum o2) {
    if (o1.ordinal() < o2.ordinal()) {
        return -1;
    } else {
        return 1;
    }
}

و}

حل!!!حيث وجدت الجواب: http://programming.itags.org/development-tools/65254/

لفترة وجيزة ، والتحويل يبحث عن اسم التعداد لا قيمة السمة 'تصنيف'.في حالة الخاص بك:إذا كان لديك في db القيم "NC-17", تحتاج إلى أن يكون في التعداد:

التعداد تصنيف {
(...)
NC-17 ( "NC-17" );
(...)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top