已经过滤关联的集合属性,还是出现There is a cycle in the hierarchy! 按照网上说的,写过滤, 加上lazy=false
照做了,还是有问题。
不知道我是不是理解有误,大家帮帮忙吧。action部分=======================================================================
public ActionForward getMenus(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
System.out.println("userAction roleTest");
UserForm userForm = (UserForm) form;
//test tea
TbTea tea=(TbTea)request.getSession().getAttribute("loginTea");
Set<TbRole> roles= tea.getTbUser().getTbRoles();
List<TbMenu> menus= userService.findMenuByRole(roles);//获取所有menu JsonConfig config = new JsonConfig();
config.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
config.setJsonPropertyFilter(new PropertyFilter() {
public boolean apply(Object source, String name, Object value) {
//这里我干脆把所有属性都加上了
if (name.equals("menuId") || name.equals("menuName")
|| name.equals("tbUrl")||name.equals("parentMenuId")
|| name.equals("tbRoles")) {
return true;
} else {
return false;
}
}
});
String result = JSONArray.fromObject(menus).toString();
System.out.println("UserAction getmenu "+result);
try {
PrintWriter out = response.getWriter();
out.print(result);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}TbMenu================================public class TbMenu implements java.io.Serializable { private Integer menuId;
private TbUrl tbUrl;
private String menuName;
private Integer parentMenuId;
private Set tbRoles = new HashSet(0);
//.......构造方法就省了
}
表的配置文件===============================
TbMenu.hbm.xml<hibernate-mapping>
<class name="emp.dao.TbMenu" table="tb_menu" catalog="db_role">
<id name="menuId" type="java.lang.Integer">
<column name="menuID" />
<generator class="native" />
</id>
<many-to-one name="tbUrl" class="emp.dao.TbUrl" fetch="select" lazy="false">
<column name="urlID" />
</many-to-one>
<property name="menuName" type="java.lang.String">
<column name="menuName" length="32" />
</property>
<property name="parentMenuId" type="java.lang.Integer">
<column name="parentMenuID" />
</property>
<set name="tbRoles" inverse="true" table="tb_menu_role" catalog="db_role" lazy="false">
<key>
<column name="menuID" not-null="true" />
</key>
<many-to-many entity-name="emp.dao.TbRole">
<column name="roleID" not-null="true" />
</many-to-many>
</set>
</class>
</hibernate-mapping>============================================
上面还用到了userService的一个方法,但是应该没有关系 public List<TbMenu> findMenuByRole(Set<TbRole> roles) {
List<TbMenu> allMenus=new ArrayList<TbMenu>();
for (TbRole role : roles) {
System.out.println(role.getRoleName());
Set<TbMenu> tempMenus=role.getTbMenus();
for (TbMenu menu : tempMenus) {
allMenus.add(menu);
}
}
//drop the duplicate menus
List<TbMenu> menus=new ArrayList<TbMenu>();
for (TbMenu menu : allMenus) {//===========================过滤掉重复的menu
if(allMenus.contains(menu)){
menus.add(menu);
}
}
return menus;
}
照做了,还是有问题。
不知道我是不是理解有误,大家帮帮忙吧。action部分=======================================================================
public ActionForward getMenus(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
System.out.println("userAction roleTest");
UserForm userForm = (UserForm) form;
//test tea
TbTea tea=(TbTea)request.getSession().getAttribute("loginTea");
Set<TbRole> roles= tea.getTbUser().getTbRoles();
List<TbMenu> menus= userService.findMenuByRole(roles);//获取所有menu JsonConfig config = new JsonConfig();
config.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
config.setJsonPropertyFilter(new PropertyFilter() {
public boolean apply(Object source, String name, Object value) {
//这里我干脆把所有属性都加上了
if (name.equals("menuId") || name.equals("menuName")
|| name.equals("tbUrl")||name.equals("parentMenuId")
|| name.equals("tbRoles")) {
return true;
} else {
return false;
}
}
});
String result = JSONArray.fromObject(menus).toString();
System.out.println("UserAction getmenu "+result);
try {
PrintWriter out = response.getWriter();
out.print(result);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}TbMenu================================public class TbMenu implements java.io.Serializable { private Integer menuId;
private TbUrl tbUrl;
private String menuName;
private Integer parentMenuId;
private Set tbRoles = new HashSet(0);
//.......构造方法就省了
}
表的配置文件===============================
TbMenu.hbm.xml<hibernate-mapping>
<class name="emp.dao.TbMenu" table="tb_menu" catalog="db_role">
<id name="menuId" type="java.lang.Integer">
<column name="menuID" />
<generator class="native" />
</id>
<many-to-one name="tbUrl" class="emp.dao.TbUrl" fetch="select" lazy="false">
<column name="urlID" />
</many-to-one>
<property name="menuName" type="java.lang.String">
<column name="menuName" length="32" />
</property>
<property name="parentMenuId" type="java.lang.Integer">
<column name="parentMenuID" />
</property>
<set name="tbRoles" inverse="true" table="tb_menu_role" catalog="db_role" lazy="false">
<key>
<column name="menuID" not-null="true" />
</key>
<many-to-many entity-name="emp.dao.TbRole">
<column name="roleID" not-null="true" />
</many-to-many>
</set>
</class>
</hibernate-mapping>============================================
上面还用到了userService的一个方法,但是应该没有关系 public List<TbMenu> findMenuByRole(Set<TbRole> roles) {
List<TbMenu> allMenus=new ArrayList<TbMenu>();
for (TbRole role : roles) {
System.out.println(role.getRoleName());
Set<TbMenu> tempMenus=role.getTbMenus();
for (TbMenu menu : tempMenus) {
allMenus.add(menu);
}
}
//drop the duplicate menus
List<TbMenu> menus=new ArrayList<TbMenu>();
for (TbMenu menu : allMenus) {//===========================过滤掉重复的menu
if(allMenus.contains(menu)){
menus.add(menu);
}
}
return menus;
}
解决方案 »
- openoffice自动关闭,导致程序没法运行
- 求大神,,,严重: Initializing application data source noticemanagerDB
- 播放器播放其他服务器上得文件
- Location.href="" 和<a href=""></a>传参有区别吗
- 怎样关闭Tomcat中 velocity的大量日志输出?
- asp主机,jsp主机整和问题
- 一个简单的时间问题,紧急呀
- 搞struts2的必看,偶尔发现的一个东西
- 麻烦大家给我提供一些有关JSP电子书下载的地址
- 大家好 能不能帮我介绍几本关于jsp教程的好书 或好的jsp教程网站?谢谢
- 【求助】用JS改写一个Java程序
- Flex问题 急。
我的menu里面刚好就这些属性
private Integer menuId;
private TbUrl tbUrl;
private String menuName;
private Integer parentMenuId;
private Set tbRoles = new HashSet(0);
他们所说的过滤属性就是指这些吗?