هل يمكنني جعل كيان السبات غير المدمج غير الظهور؟

StackOverflow https://stackoverflow.com/questions/1324266

  •  19-09-2019
  •  | 
  •  

سؤال

ماذا اريد:

@Embedded(nullable = false)
private Direito direito;

ومع ذلك، كما تعلمون أنه لا توجد سمة مثل EmbedDiable.

هل هناك طريقة صحيحة للقيام بذلك؟ أنا لا أريد الحلول.

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

المحلول

عادة ما تحتوي المكونات القابلة للتثبيت (أو العناصر المركبة، مهما كنت ترغب في الاتصال بها) عادة أكثر من خاصية واحدة، وبالتالي يتم تعيينها إلى أكثر من عمود واحد. وبالتالي، يمكن معالجة المكون بأكمله بليغا بطرق مختلفة؛ j2ee المواصة لا يملي بطريقة أو بأخرى.

يعتبر مظلل السبات عناصر أن تكون فارغة إذا كانت جميع خصائصها فارغة (والعكس صحيح). لذلك يمكنك أن تعلن واحدة (أي) من الخصائص غير فارغة (إما داخل @Embeddable أو كجزء من @AttributeOverride على @Embedded) لتحقيق ما تريد.

بدلا من ذلك، إذا كنت تستخدم Validator السبات، فيمكنك التعليق على ممتلكاتك @NotNull على الرغم من أن هذا لن يؤدي إلا إلى فحص مستوى التطبيق، وليس مستوى DB.

نصائح أخرى

من الممكن استخدام "hibernate.create_mepty_composites.enabled" منذ السبات 5.1 لتغيير هذا السلوك (انظر https://hopernate.atlassian.net/browse/hhh-7610. )

أضف حقل دمية إلى فئة يتم تمييزها embedDiable.

@Formula("0")
private int dummy;

يرى https://issues.jboss.org/browse/hibernate-50. .

لم أكن غامرة للغاية بأي من الاقتراحات التي تم إجراؤها مسبقا، لذلك قمت بإنشاء جانب من شأنه أن يتعامل مع هذا بالنسبة لي.

لا يتم اختبار هذا بالكامل، وبالتأكيد لم يتم اختباره ضد مجموعات من الكائنات المضمنة، لذلك حذار المشتري. ومع ذلك، يبدو أن العمل بالنسبة لي حتى الآن.

في الأساس، اعتراض الحصول على @Embedded حقل ويضمن سكان الحقل.

public aspect NonNullEmbedded {

    // define a pointcut for any getter method of a field with @Embedded of type Validity with any name in com.ia.domain package
    pointcut embeddedGetter() : get( @javax.persistence.Embedded * com.company.model..* );


    /**
     * Advice to run before any Embedded getter.
     * Checks if the field is null.  If it is, then it automatically instantiates the Embedded object.
     */
    Object around() : embeddedGetter(){
        Object value = proceed();

        // check if null.  If so, then instantiate the object and assign it to the model.
        // Otherwise just return the value retrieved.
        if( value == null ){
            String fieldName = thisJoinPoint.getSignature().getName();
            Object obj = thisJoinPoint.getThis();

            // check to see if the obj has the field already defined or is null
            try{
                Field field = obj.getClass().getDeclaredField(fieldName);
                Class clazz = field.getType();
                value = clazz.newInstance();
                field.setAccessible(true);
                field.set(obj, value );
            }
            catch( NoSuchFieldException | IllegalAccessException | InstantiationException e){
                e.printStackTrace();
            }
        }

        return value;
    }
}

يمكنك استخدام getter nullsafe.

public Direito getDireito() {
    if (direito == null) {
        direito = new Direito();
    }
    return direito;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top