سؤال

هل لديك فئة قاعدة مشتركة للكيانات السبات، أي على MappedSuperclass مع الهوية، ونسخة والخصائص المشتركة الأخرى؟ هل هناك أي عيوب؟

مثال:

@MappedSuperclass()
public class BaseEntity {

    private Long id;
    private Long version;
    ...

    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    public Long getId() {return id;}

    public void setId(Long id) {this.id = id;}

    @Version
    public Long getVersion() {return version;}
    ...

    // Common properties
    @Temporal(TemporalType.TIMESTAMP)
    public Date creationDate() {return creationDate;}
    ...
}

@Entity
public class Customer extends BaseEntity {
    private String customerName;
    ...
}
هل كانت مفيدة؟

المحلول

وهذا يعمل بشكل جيد بالنسبة لنا. فضلا عن تاريخ ID والخلق، ايضا لدينا تاريخ التعديل. لدينا أيضا وسيطة <م> TaggedBaseEntity التي تطبق <م> Taggable واجهة، لأن بعض الكيانات لدينا تطبيق ويب لديهم العلامات، مثل الأسئلة على تجاوز المكدس.

نصائح أخرى

وواحد التي تستخدم في المقام الأول لتنفيذ شفرة التجزئة () ويساوي (). أود أيضا أن أضيف طريقة لطباعة جميلة الكيان. وردا على DR أعلاه، أكثر من هذا يمكن أن يتم تجاوز، ولكن في تنفيذ بلدي كنت عالقة مع معرف من نوع طويل.

public abstract class BaseEntity implements Serializable {

    public abstract Long getId();
    public abstract void setId(Long id);

    /**
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
        return result;
    }

    /**
     * @see java.lang.Object#equals(Object)
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        BaseEntity other = (BaseEntity) obj;
        if (getId() == null) {
            if (other.getId() != null)
                return false;
        } else if (!getId().equals(other.getId()))
            return false;
        return true;
    }

    /**
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return new StringBuilder(getClass().getSimpleName()).append(":").append(getId()).toString();
    }

    /**
     * Prints complete information by calling all public getters on the entity.
     */
    public String print() {

        final String EQUALS = "=";
        final String DELIMITER = ", ";
        final String ENTITY_FORMAT = "(id={0})";

        StringBuffer sb = new StringBuffer("{");

        PropertyDescriptor[] properties = PropertyUtils.getPropertyDescriptors(this);
        PropertyDescriptor property = null;
        int i = 0;
        while ( i < properties.length) {

            property = properties[i];
            sb.append(property.getName());
            sb.append(EQUALS);

            try {
                Object value = PropertyUtils.getProperty(this, property.getName());
                if (value instanceof BaseEntity) {
                    BaseEntity entityValue = (BaseEntity) value;
                    String objectValueString = MessageFormat.format(ENTITY_FORMAT, entityValue.getId());
                    sb.append(objectValueString);
                } else {
                    sb.append(value);
                }
            } catch (IllegalAccessException e) {
                // do nothing
            } catch (InvocationTargetException e) {
                // do nothing
            } catch (NoSuchMethodException e) {
                // do nothing
            }

            i++;
            if (i < properties.length) {
                sb.append(DELIMITER);
            }
        }

        sb.append("}");

        return sb.toString();
    }
}

وأنا لن تتردد في استخدام فئة قاعدة مشتركة، وبعد كل هذا هو بيت القصيد من O / R رسم الخرائط.

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

وكان يعمل بشكل جيد للغاية بالنسبة لي.

لاحظ أنه يمكنك أيضا في هذا الكيان إضافة بعض المستمعين الحدث / اعتراضية مثل السبات Envers واحد أو أي عرف واحد وفقا للحاجة الخاصة بك بحيث يمكنك: - تتبع جميع التعديلات - معرفة المستخدم الذي جعل التعديل الأخير - تحديث تلقائيا التعديل الأخير - تعيين تلقائيا تاريخ الإدراج الأول وذر أشياء من هذا القبيل ...

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