Interesting knowing hibernate adds extra queries, how would you go about setting up the parent relationship in the entity?
On Sat, Feb 18, 2012 at 4:34 PM, Lance Java [via Tapestry] < ml-node+s1045711n5495924...@n5.nabble.com> wrote: > > Thanks Lance > No problem > > > I did want to say I finally got the tree to work yay!! > Great > > > I needed to add ".id" to the restriction. > Depending on how you've set up your hibernate entities, you may not have > the actual parent id available on your entity and may have to access it > through the parent object then get it's id. As I said before... hibernate > often forces you to do stupid things. In this case you have actually done > an unnecessary join to the table again to get the parent's properties when > you only actually needed the id. This wouldn't have been needed if you > were > using JDBC. As I mentioned earlier, try turning on hibernate's SQL logging > and I'm sure you will see all sorts of stupid things going on. I'm in the > minority though... there are many people who think hibernate is great... > I'm just not one of them ;) > > > I was unable to @Inject CateogryDao into CategoryTreeModelAdapter > You can only @Inject into services that are instantiated by Tapestry (ie > services defined in AppModule). If you have created it using > new CategoryTreeModelAdapter(), it's not under tapestry's control and > doesn't get any injection goodies. > > > Lastly, one remaining bug thus far, when ever findRoots is null, the > tree throws back the following exception. > Try returning an empty list, not null > > I look forward to seeing this as part of JumpStart as it's not trivial. > > Cheers, > Lance. > > > On 18 February 2012 17:05, George Christman <[hidden > email]<http://user/SendEmail.jtp?type=node&node=5495924&i=0>> > wrote: > > > Thanks Lance, I'll read through those articles this weekend. I'd love to > > learn more about these things so I wouldn't need to rely so heavily on > the > > support of the community. > > > > I did want to say I finally got the tree to work yay!! > > > > A few changes that had to be made > > > > public List<CategoryNode> getChildren(CategoryNode node) { > > return findByCriterion(Restrictions.eq("parentCategoryId.id", > > node.getCategory().getId())); > > } > > > > I needed to add ".id" to the restriction. > > > > When ever your using createSQLQuery, you can directly iterate it. You'll > > need to use a .list() be for using iterator. > > > > I did end up getting the tapestry service working, apparently my issue > had > > to do with me trying to inject HibernateCategoryDao rather than > > CategoryDao. > > > > I was unable to @Inject CateogryDao into CategoryTreeModelAdapter, I had > to > > pass it in through a constructor. Is there away to use Inject outside of > > page and component classes? > > > > Lastly, one remaining bug thus far, when ever findRoots is null, the > tree > > throws back the following exception. > > > > java.lang.NullPointerExceptionFilter stack frames Stack trace > > > > - org.apache.tapestry5.corelib.components.Tree$3.render(Tree.java:150) > > - > > > org.apache.tapestry5.internal.services.RenderQueueImpl.run(RenderQueueImpl.java:72) > > > > > - > > > org.apache.tapestry5.internal.services.PageRenderQueueImpl.render(PageRenderQueueImpl.java:124) > > > > > - > > > org.apache.tapestry5.internal.services.MarkupRendererTerminator.renderMarkup(MarkupRendererTerminator.java:37) > > > > > - > > > org.apache.tapestry5.services.TapestryModule$30.renderMarkup(TapestryModule.java:1979) > > > > > > > I feel as if this may be a Tapestry tree component issue? > > > > Thanks a ton Lance! > > > > > > > > On Sat, Feb 18, 2012 at 5:08 AM, Lance Java [via Tapestry] < > > [hidden email] <http://user/SendEmail.jtp?type=node&node=5495924&i=1>> > wrote: > > > > > Hi George, > > > > > > In you code, there should only be 2 references to > HibernateCategoryDao. > > > 1. In AppModule > > > binder.bind(CategoryDao.class, HibernateCategoryDao.class); > > > 2. In the HibernateCategoryDao class itself > > > > > > Every other class (page, value encoder, treeModelAdapter) should > > reference > > > CategoryDao > > > eg @Inject CategoryDao categoryDao > > > > > > Interfaces are a contract and have no implementation details. It's > much > > > better to code against interfaces and only be bound to the actual > > > implemtation at runtime for many reasons including: > > > 1. In your unit tests, you could inject a MockCategoryDao and not > require > > > a > > > database > > > 2. In the future, you may need to change the implementation to a > > > WebServiceCategoryDao (or something else) and all you need to change > is > > > AppModule > > > 3. Tapestry uses the IOC pattern (inversion of control) and actually > > > injects a wrapper around HibernateCategoryDao so the @Inject'ed bean > is > > > not > > > actually an instance of HibernateCategoryDao (it does delegate to it > > > though). > > > 4. If you code to an interface, you can do all sorts fancy things with > > > proxies including the interceptor pattern > > > > > > Some further reading > > > http://en.wikipedia.org/wiki/Inversion_of_control > > > http://en.wikipedia.org/wiki/Proxy_pattern > > > http://en.wikipedia.org/wiki/Interceptor_pattern > > > > > > I've made a couple of mods to the code too: > > > > > > List<Category> cats = > > > session.createCriteria(Category.class).add(criterion).list(); > > > Map<Integer, CategoryNode> childNodes = new > LinkedHashMap<Integer, > > > CategoryNode>(); > > > for (Category cat : cats) { > > > CategoryNode childNode = new CategoryNode(); > > > childNode.setCategory(cat); > > > childNodes.put(cat.getId(), childNode); > > > } > > > if (!childNodes.isEmpty()) { // if empty, the next query will > fail > > > > > > Query query = session.createSQLQuery( > > > "select c1.id, count(c2.id) " > > > + "from CATEGORY c1 " > > > + "left join CATEGORY c2 on c2.parent_id = c1.id " > > > + "where c1.id in (:catIds) " > > > + "group by c1.id"); > > > > > > query.setParameterList("catIds", > > childNodes.keySet().toArray()); > > > List queryResult = query.list(); > > > > > > for (Iterator<Object[]> it = query.iterate(); it.hasNext(); > ) { > > > Object[] result = it.next(); > > > Long childId = (Long) result[0]; > > > Integer grandChildCount = (Integer) result[1]; > > > CategoryNode childNode = childNodes.get(childId); > > > childNode.setHasChildren(grandChildCount != 0); > > > childNode.setLeaf(grandChildCount == 0); > > > } > > > } > > > return new ArrayList<CategoryNode>(childNodes.values()); > > > > > > Cheers, > > > Lance > > > > > > On 18 February 2012 02:55, George Christman <[hidden email]< > > http://user/SendEmail.jtp?type=node&node=5495019&i=0>> > > > wrote: > > > > > > > btw, I should mention the model exception only happens while trying > to > > > > expand > > > > the tree node. It produces an ajax exception. > > > > > > > > -- > > > > View this message in context: > > > > > > > > > > http://tapestry.1045711.n5.nabble.com/Tapestry-TreeGrid-tp5462126p5494602.html > > > > > > > Sent from the Tapestry - User mailing list archive at Nabble.com. > > > > > > > > > --------------------------------------------------------------------- > > > > To unsubscribe, e-mail: [hidden email]< > > http://user/SendEmail.jtp?type=node&node=5495019&i=1> > > > > For additional commands, e-mail: [hidden email]< > > http://user/SendEmail.jtp?type=node&node=5495019&i=2> > > > > > > > > > > > > > > > > > ------------------------------ > > > If you reply to this email, your message will be added to the > discussion > > > below: > > > > > > > > > http://tapestry.1045711.n5.nabble.com/Tapestry-TreeGrid-tp5462126p5495019.html > > > To unsubscribe from Tapestry TreeGrid, click here< > > > > > > > . > > > NAML< > > > http://tapestry.1045711.n5.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml > > > > > > > > > > > > > > -- > > George Christman > > www.CarDaddy.com > > P.O. Box 735 > > Johnstown, New York > > > > > > -- > > View this message in context: > > > http://tapestry.1045711.n5.nabble.com/Tapestry-TreeGrid-tp5462126p5495570.html > > > Sent from the Tapestry - User mailing list archive at Nabble.com. > > > > > ------------------------------ > If you reply to this email, your message will be added to the discussion > below: > > http://tapestry.1045711.n5.nabble.com/Tapestry-TreeGrid-tp5462126p5495924.html > To unsubscribe from Tapestry TreeGrid, click > here<http://tapestry.1045711.n5.nabble.com/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=5462126&code=Z2NocmlzdG1hbkBjYXJkYWRkeS5jb218NTQ2MjEyNnwxNjMyOTYxMjA3> > . > NAML<http://tapestry.1045711.n5.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml> > -- George Christman www.CarDaddy.com P.O. Box 735 Johnstown, New York -- View this message in context: http://tapestry.1045711.n5.nabble.com/Tapestry-TreeGrid-tp5462126p5496217.html Sent from the Tapestry - User mailing list archive at Nabble.com.