一、需求原因
在我做系统架构时遇到情况是这样:资源菜单实体类(Resource)和角色实体类(Role)是多对多关系,需要各个角色可以个性化自己的资源菜单顺序。
二、设计理念
多对多的关系拆分为两个一对多
三、具体配置
方式一:XML方式
Role实体
public class Role implements Serializable {
/*ID*/
privateLong id;
/*名称*/
privateString name;
/*与RoleResource的一对多关系*/
PrivateSet roleResources= new HashSet();
//get set
}
Resource实体
public class Resource implements Serializable {
/*ID*/
privateLong id;
/*名称*/
privateString name;
/*与RoleResource的一对多关系*/
privateSet roleResources = new HashSet();
// getset
}
RoleResource辅助实体
public class RoleResource implements Serializable{
/*ID*/
privateLong id;
/*与Role的多对一关系*/
privateRole role;
/*与Resource的多对一关系*/
privateResource resource;
/*排序字段*/
privateInteger sort;
// getset
}
Role.hbm.xml
Resource.hbm.xml
RoleResource.hbm.xml
Hibernate.cfg.xml中配置
方式二:Annotation方式
Role实体
@Entity
@Table(name="glw_role")
public class Role {
@Id
@GeneratedValue(strategy=GenerationType.TABLE)
privateLong id;
@Column(length=50)
privateString name;
@OneToMany(mappedBy="role",cascade=CascadeType.ALL)
privateSet roleResources = new HashSet();
//get set
}
Resource实体
@Entity
@Table(name="glw_resource")
public class Resource {
@Id
@GeneratedValue(strategy=GenerationType.TABLE)
privateLong id;
@Column(length=50)
privateString name;
@OneToMany(mappedBy="resource",cascade=CascadeType.ALL)
privateSet roleResources = new HashSet();
// getset
}
RoleResource辅助实体
@Entity
@Table(name="glw_role_resource")
public class RoleResource {
@Id
@GeneratedValue(strategy=GenerationType.TABLE)
privateLong id;
@Column
privateInteger sort;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="roleId",nullable=true)
privateRole role;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="resourceId",nullable=true)
privateResource resource;
// getset
}
Hibernate.cfg.xml中配置
四、完毕
Xml和Annotation方式可任意选取一种,以上本人均测试通过。