Forums Register Login

Hibernate loads only first element of the collection

+Pie Number of slices to send: Send
I use Springs SimpleFormController to write Post objects into database:



Then i load the blog using my dao in another controller:



Then finally i print all the posts from the blog in the jsp:



The problem is that the collection of posts always contains only one post, although i can see that there are more in database. Seems that not all are loaded from db. Any suggestions will be appreciated...

+Pie Number of slices to send: Send
First my architecture part I don't like.

I would not put DAOs and calls to them in a Controller. I would always have a Service class in between the two. So Controller gets a Service class injected and the Service class has a DAO injected and the service class calls the DAO method. It just leaves room for enhancements, maintenance (You always know which level has what), and also scalability. Enchancements could be more code for the use case in the service, also you can now expose your service to other remoting technologies like Web Services, RMI, HttpInvoker, etc.

Now to you real problem. Can you remote debug and check line 9 where you call blogDao.getBlog(blogId) and stop past the line and examine the blog object in your debugger. This way you can seperate Hibernate from your Web code to see what is the real root cause of the problem. Also can you post your code that is in the getBlog() method so that we can see your query you are running, but only if you find after you remote debug that the blog object returned doesn't have the correct data.

Mark
+Pie Number of slices to send: Send
Regarding architecture, actually DAO is a kind of service, it's data access service.

Even using DAO, the implementation can be anything including Web Services, RMI, etc., because we use interface, not concrete class.
But I don't like DAO pattern, I prefer to use Repository (Domain-Driven Design).
+Pie Number of slices to send: Send
 

Mark Spritzler wrote:
Can you remote debug and check line 9 where you call blogDao.getBlog(blogId) and stop past the line and examine the blog object in your debugger.



Well there is the System.out statement i used for debug. Its line 12:



It shows that size of collection is 1, so there is something wrong with it already.

Mark Spritzler wrote:
Also can you post your code that is in the getBlog() method so that we can see your query you are running, but only if you find after you remote debug that the blog object returned doesn't have the correct data.





Any ideas?
+Pie Number of slices to send: Send
Are you sure you have data in database?
Can you also post your mapping file?

BTW, this code looks strange to me:


BlogDao should save blog, not save post.
It should be like this:

+Pie Number of slices to send: Send
 

Kengkaj Sathianpantarit wrote:Regarding architecture, actually DAO is a kind of service, it's data access service.

Even using DAO, the implementation can be anything including Web Services, RMI, etc., because we use interface, not concrete class.
But I don't like DAO pattern, I prefer to use Repository (Domain-Driven Design).



Sorry. a DAO/Repository is a Data Access Object, not a Use Case Service class. Service or business logic can use DAOs, but a DAO can never be considered business logic, if you try to merge the meaning of DAO with Service then you are just getting into low cohesion of your code and in OO and architecture that is not a good thing to do. And DAO and Repository is the same type of class. And yes I prefer the term Repository now too.

Mark
+Pie Number of slices to send: Send
 

Jay Chmiel wrote:

Mark Spritzler wrote:
Can you remote debug and check line 9 where you call blogDao.getBlog(blogId) and stop past the line and examine the blog object in your debugger.



Well there is the System.out statement i used for debug. Its line 12:



It shows that size of collection is 1, so there is something wrong with it already.

Mark Spritzler wrote:
Also can you post your code that is in the getBlog() method so that we can see your query you are running, but only if you find after you remote debug that the blog object returned doesn't have the correct data.





Any ideas?



OK, so you are using "get" here, that would probably explain a bit more why you are not seeing what you expect to see. There seems to be a few things going on here that makes it tougher to figure out exactly where your problem is.

1) Is this a two directional association, I notice you set the Blog to the Post object but not adding the Post object to the Blog's Post Collection. So in those terms I kind of see only one Post getting associated to the Blog, and not many Posts to the Blog.

2) I agree with Kengkaj last comment about passing a Post object to the BlogDAO.
His second code is almost correct, and it depends on the bi-directionality, you might have one more line of code to set the other side. like

newPost.setBlog(blog);

I highly recommend you learn to "remote" debug you code and step through it rather than System.out.printlns. You will find your problems a lot quicker and it is pretty easy to set up. If you are using an IDE, then it is already built in.

At this point, it is becoming more obvious, that this isn't a Spring question, but a Hibernate question, so I am going to move this thread to the more appropriate Object Relational Mapping forum where Hibernate questions are posted.

Thanks

Mark
+Pie Number of slices to send: Send
 

Mark Spritzler wrote:

Kengkaj Sathianpantarit wrote:Regarding architecture, actually DAO is a kind of service, it's data access service.

Even using DAO, the implementation can be anything including Web Services, RMI, etc., because we use interface, not concrete class.
But I don't like DAO pattern, I prefer to use Repository (Domain-Driven Design).



Sorry. a DAO/Repository is a Data Access Object, not a Use Case Service class. Service or business logic can use DAOs, but a DAO can never be considered business logic, if you try to merge the meaning of DAO with Service then you are just getting into low cohesion of your code and in OO and architecture that is not a good thing to do. And DAO and Repository is the same type of class. And yes I prefer the term Repository now too.


I say, DAO/Repository is a kind of service (data access service), I didn't say that they are "Use Case Service" or business logic. But I know your point and I agree with you. Our argument is caused from differently interpreting meaning of "service" in context.
Generally, Services (especially in Domain-Driven Design) should contain domain logic (for non-DDD Services usually refer to application services).
But we can use word "service" for other things as well.

[Off-topic] Just want to note that Repository is not just a term, it's not the same with DAO (you might have already known).

My point is it's not relate to Web Services, RMI, etc., Domain Service, Application Service, DAO, Repository can use Web Services, RMI, etc. in implementation. Because they are just interfaces.
+Pie Number of slices to send: Send
 

Kengkaj Sathianpantarit wrote:
BlogDao should save blog, not save post.
It should be like this:



Ok, so i changed the code. Now I get the stacktrace on blogDao.save(blog) line:

It laso happens when i add the line newPost.setBlog(blog); as Mark Spritzler advised.

Kengkaj Sathianpantarit wrote:
Are you sure you have data in database?
Can you also post your mapping file?



Yes, im sure that the posts are in DB and they have blog_id set properly. Here goes my mapping file:



Thanks for all of you guys for helping me.
So there I was, trapped in the jungle. And at the last minute, I was saved by this tiny ad:
a bit of art, as a gift, the permaculture playing cards
https://gardener-gift.com


reply
reply
This thread has been viewed 5323 times.
Similar Threads
Session swapping problem under load
Bind global errors to Spring form and throw them to view
MultiActionController issue
How to persist form data across different pages
error in ArrayList in JSP
More...

All times above are in ranch (not your local) time.
The current ranch time is
Mar 28, 2024 12:07:34.