Do you have a common base class for Hibernate entities?

后端 未结 5 491
面向向阳花
面向向阳花 2021-02-01 05:51

Do you have a common base class for Hibernate entities, i.e. a MappedSuperclass with id, version and other common properties? Are there any drawbacks?

Example:



        
5条回答
  •  伪装坚强ぢ
    2021-02-01 06:25

    The one that I use is primarily to implement hashCode() and equals(). I also added a method to pretty print the entity. In response to DR above, most of this can be overridden, but in my implementation you are stuck with an ID of type Long.

    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();
        }
    }
    

提交回复
热议问题