已经过滤关联的集合属性,还是出现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;
}