实体关联映射——权限系统

来源:互联网 发布:python pip安装 编辑:程序博客网 时间:2024/05/18 01:12


项目地址:https://git.oschina.net/aboy2008/FirstWeb

    在spring底层框架搭建过程中,实体之间的关联关系,个人感觉JPA与其hibernate实现确实棒棒的!

    不过在实施过程中,遇到了太多关于数据关联关系设计混乱,维护困难的情况。当自己在搭建底层框架式,通过对hibernate的理解,设计Relation的接口,来约束大多数情况下的实体关联关系,效果显著。

    

/** * 关联类接口。 * <p>Author: smy * <p>Date: 2016/12/11 */public interface Relation<F extends BaseBean,S extends BaseBean> {   /**    * 获取实体1    * @return 实体1    */   F getFirst();   /**    * 设置实体1    * @param first 实体1    */   void setFirst(F first);   /**    * 获取实体2    * @return 实体2    */   S getSecond();   /**    * 设置实体2    * @param second 实体2    */   void setSecond(S second);}
/** * 关联实体基类。 * <p>Author: smy * <p>Date: 2016/12/11 */@MappedSuperclasspublic abstract class RelationEntity<F extends BaseEntity,S extends BaseEntity>      extends BaseEntity implements Relation<F,S> {   @ManyToOne   @JoinColumn(name = "first_id", referencedColumnName = "id")   private F first;   @ManyToOne   @JoinColumn(name = "second_id", referencedColumnName = "id")   private S second;   @Override   public F getFirst() {      return first;   }   @Override   public void setFirst(F first) {      this.first = first;   }   @Override   public S getSecond() {      return second;   }   @Override   public void setSecond(S second) {      this.second = second;   }}

管理接口如下:

/** * <p>级联实体的通用Dao层。 * <p>Author: smy * <p>Date: 2016/11/17 */public interface RelationDao extends CommonDao {   void setUpRelationForFirst(Class<? extends RelationEntity> relationClass, String firstId, String... secondIds);   void setUpRelationForSecond(Class<? extends RelationEntity> relationClass, String secondId, String... firstIds);   <T extends BaseEntity,R extends RelationEntity>   List<R> getRelations(Class<R> relationClass, Class<T> referClazz, String referId);   <F extends BaseEntity,S extends BaseEntity,R extends RelationEntity<F,S>>   List<F> getFirsts(Class<R> relationClass, String secondId);   <F extends BaseEntity,S extends BaseEntity,R extends RelationEntity<F,S>>   List<S> getSeconds(Class<R> relationClass, String firstId);   <T extends BaseEntity,R extends RelationEntity>   List<R> getRelations(Class<R> relationClass, Class<T> referClazz, String... referIds);   <F extends BaseEntity,S extends BaseEntity,R extends RelationEntity<F,S>>   List<F> getFirsts(Class<R> relationClass, String... secondIds);   <F extends BaseEntity,S extends BaseEntity,R extends RelationEntity<F,S>>   List<S> getSeconds(Class<R> relationClass, String... firstIds);   void deleteRelation(Class<? extends BaseEntity> clazz, String id);   void deleteRelation(Class<? extends BaseEntity> clazz, String... ids);}

改设计方案保证的原实体的独立性,并可以对关联关系进行统一管理。

    整个方案可以在https://git.oschina.net/aboy2008/FirstWeb  中的floor/extend/relation进行查看。

以权限系统用户与用户组关系为例:

@Entity@Table(name = "system_authority_user_group")public class UserGroupRelation extends RelationEntity<UserEntity,GroupEntity> {}

    通过关联关系的统一调用,对整个权限系统的关联关系管理。



0 0
原创粉丝点击