On Tue, May 14, 2013 at 12:05 AM, Boris Horvat <horvat.z.bo...@gmail.com>wrote:
> Hi Dmitry > > Please ignore the naming as I haven't really user he real names here as > this is just an example (the project also has nothing to do with Students > but it is easier for the explanations :) ). In all fairness though I do > prefer to append DAOService in front as it allows me to search for the > class more easily (If my page, service and domain class all start with > Student it is annoying to find anything) > > The @CommitAfter it is my manager that has this class not the DAO's so I > guess why use the same approach > > As for the constructor and @Inject annotation I know that I can use it but > in that way I restrain my self to Tapestry (or Spring), which is not the > case if I use constructor. > > I am aware of the God anti pattern and while there is fine line between > that and my code I dont think I have crossed it as I have more then one > manager. They represent an area of business logic and basically they are > place where transaction annotation is put. Still it is something to keep in > mind I agree. > > I think now I understand a bit more about the Session object in Tapestry. > So yes if it is shard across all of my DAO object that would be what > the behavior what I need. Do you know any place where I can read a bit > about it? I am interested it as from what I can see in my code constructor > is only called once (you also confirmed this) so I was wondering how does > it switch the Session object each time? You mention it is a proxy so I > guess that is how it replaces it, right? > > You can read about proxies here: http://tapestry.apache.org/defining-tapestry-ioc-services.html http://tapestry.apache.org/defining-tapestry-ioc-services.html#DefiningTapestryIOCServices-DefiningServiceScope > Thanks for the reply, > > Cheers, > Boris > > > On Mon, May 13, 2013 at 10:09 AM, Dmitry Gusev <dmitry.gu...@gmail.com > >wrote: > > > On Mon, May 13, 2013 at 2:59 AM, Boris Horvat <horvat.z.bo...@gmail.com > > >wrote: > > > > > Hi all, > > > > > > > > Hi! > > > > > > > I have a question about what should be the best way to use hibernate > > > session in tapestry. > > > > > > My environment consists of 2 layers (relevant to this). > > > > > > The first one would be a group of classes that represent an access > point > > to > > > a table. For example if I have a table student then I will have a class > > > DAOHibernateStudent. This class receives Session object in its > > constructor. > > > Doing it this way I can separate all of the queries that are available > > for > > > that table into its own class. > > > > > > > > Thats strange naming, I would name the interface as StudentDAO, and > > implementation as just StudentDAOImpl. > > > > Note that you can also @Inject session to your DAO, you don't have to > pass > > it through the constructor. > > > > Btw, in my projects I never put @CommitAfter annotations in this layer. > In > > this case I can do more than one DAO-method-call in a single transaction. > > > > The second layer is a class called Manager that implements business > logic. > > > This layer has fields that represent different DAOHibernate* classes. > > They > > > are all passed down using constructor. This way I can keep my business > > > logic in a special class which will communicate with different table > > > using different DAOHibernate* objects > > > > > > > > Again, you don't have to pass DAO instances via constructor, use @Inject. > > > > Having one big Manager class looks like God Object anti-pattern to me -- > > http://en.wikipedia.org/wiki/God_object > > > > I usually have one Manager class per table, so in it would be named > > StudentManager in your case. > > > > Its okay having multiple different DAO instances to be injected in this > > ConcreteManager class also, as well as another manager classes if you > wish. > > > > Usually I put most of @CommitAfter annotations on this layer, some of > them > > goes to page classes event handlers directly. Depends on use-case. > > > > I use @Inject annotation to inject manager into a page > > > > > > Lets imagine that I want to create a new Student. So my code would > call a > > > Manager's method createStudent(some data) which would then use a few of > > the > > > DAO classes to do all sorts of stuff (e.g. create a student, register > > > subjects for him, assign him a mentor, add him to a student group, send > > > notification email and so on...). > > > > > > The problem that I see here is that since all of those DAO classes are > > > independent I need to use few Session objects as each one will receive > > its > > > own session object. So here are my questions. > > > > > > > > As far as I know in tapestry there is only one instance of Session object > > per request (at least by default) -- its a per-thread proxy. > > And this Session instance is shared across all your DAO/Manager > instances. > > > > > > > > > > 1. Will every time when someone loads/refreshes/opens the page a new > > > Manager class be created which will in return create a new > > DAOHibernate* > > > objects and each one will receive a new Session object? > > > > > > > There are only two scopes for tapestry services now: SINGLETON and > > PERTRHEAD > > > > > http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/ScopeConstants.html > > > > So if you bind your service via AppModule then by default you declare > > singleton instance. > > > > So only one instance of your Manager/DAO classes will be created and > > injected to your page instance. > > Btw, there's also only once instance of your page class will be created > and > > shared across all requests. > > > > 2. Is it a good idea to use different session objects for the same > > > transaction I guess (yea I know that it is not good idea so moving > to > > > the > > > next question) > > > > > > > As I said above, you usually have one Session object per request, and its > > okay. > > > > Since you will use single session instance you will have common > first-level > > cache for all your request-scoped-queries, which is also good, I think. > > > > > > > 3. How should this problem be solved? Should I pass new session > object > > > > to manager and then pass it as a method parameter to the DAOHibernate* > > > > > > > Leave session management to tapestry and only think about transaction > > scope, i.e. where to put @CommitAfter annotations. > > > > Use @Inject to inject sessions and other tapestry services to your > classes. > > > > > > > 4. Any general tips about this approach? > > > > > > > Thanks all, > > > > > > Cheers > > > > > > -- > > > Sincerely > > > *Boris Horvat* > > > > > > > > > > > -- > > Dmitry Gusev > > > > AnjLab Team > > http://anjlab.com > > > > > > -- > Sincerely > *Boris Horvat* > -- Dmitry Gusev AnjLab Team http://anjlab.com