ORM的树映射实现

我的考虑是用一个level字段代替lft和rgt字段,level字段维护着Category实例的层级关系。
例如,将root的level定义为1(这个在数据库或程序中可配),那么Child 1的level就为1|${id}(其中'|'为Level分层标记,${id}表示当前数据Id或其它可唯一标识的字段值),假定为1|2,同理Child 1.1的level就是1|2|3。
类结构如下所示:使用的是annotation的hibernate

Java代码 复制代码
  1. @Entity  
  2. public class Category implements Serializable {   
  3.   
  4.     /** Level分层标记 */  
  5.     public static final String LEVEL_SPLIT = "|";   
  6.   
  7.     @Id  
  8.     @GeneratedValue  
  9.     private Integer id;   
  10.        
  11.     /** 名称 */  
  12.     private String name;   
  13.   
  14.     /** level */  
  15.     private String level;   
  16.        
  17.     /** 删除标记 */  
  18.     private Boolean delFlag;   
  19.   
  20.     /** 下级的类别 */  
  21.     @OneToMany(fetch = FetchType.LAZY, mappedBy="parent")   
  22.     @OrderBy("id")   
  23.     private List<Category> children = new ArrayList<Category>();   
  24.   
  25.     /** 上级的类别 */  
  26.     @ManyToOne  
  27.     @JoinColumn(name = "category_id")   
  28.     private Category parent;   
  29.        
  30.     // 省略所有 getter/setter 方法...   
  31. }  


维护后数据库中的数据如下: 



查找某个特定类型及其子类,只需要获得当前类型的level值,然后查找 (level like 'xxxx%')即可。如下所示:
Rails中需要重写Category中类似find的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值