Solved

Hibernate: How do I map a one-to-many list with String key and no FK

Posted on 2009-05-02
6
645 Views
Last Modified: 2013-11-24
I have 2 views in oracle

parent:
row_id (VARCHAR)
col1
col2

child:
parent_row_id(VARCHAR)
col1
col2(date)

How can do the mapping so that parent has a List containing children
List<Child> children
and which children ordered by col2(date) descending

These 2 view doesn't really have a PK and no FK relationship and child view has no uid but only parent_row_id in (VARCHAR)

Please Advise
Thanks!
0
Comment
Question by:roychan0328
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 3
6 Comments
 
LVL 40

Expert Comment

by:mrjoltcola
ID: 24290053
You can have Hibernate instantiate the relationship for you, or you can instantiate it yourself. It is tempting to do it all in hibernate, but I have found, in my experience, that there are times you have different use cases for loading the same domain object, and in some cases, if don't want dependents loaded, it could hurt performance. I usually manually load child collections and leave Hibernate out of it.

Anyway, to do it with Hibernate, you need to add the bean property to the Parent class:

List<Child> children; // also getters/setters

Then create your parent.hbm.xml as below:

Also create a child.hbm.xml, but if you use inverse="false" you don't have to add anything to the child. If you do want the child to refer back, then you need to declare a relationship in the child hbm file, something like below, but not necessarily with the same otions.

Inside child.hbm.xml

      <many-to-one name="parent" column="PARENT_ROW_ID" class="com.foo.domain.Parent" insert="false" update="false" lazy="false" />

And your Child bean must have "parent" as an exposed bean property. Likewise, Parent needs children as a bean property.

<!-- parent.hbm.xml -->
<hibernate-mapping>
	<class name="com.foo.domain.Parent" table="PARENT">
		<id name="id" column="ROW_ID">
			<generator class="assigned"/>
		</id>
 
		<property name="col1" column="COL1"/>
		<property name="col2" column="COL2"/>
 
		<!-- Associations -->
		<set name="children" inverse="false">
			<key column="PARENT_ROW_ID"/>
			<one-to-many class="com.foo.domain.Child"/>
		</set>       
	</class>
</hibernate-mapping>

Open in new window

0
 

Author Comment

by:roychan0328
ID: 24290093
Thanks mrjoltcola. I totally understand what you mean by not loading the dependents in some cases.

OK. So if I decided not to load the association by hibernate. What is the best way of doing it?

public Collection<Parent> getAllParents(){ ... } this one is easy, just use parent mapping and won;t load dependent

//load dependents
public Parent getParentsById(String key){ ... }
use 1 parent mapping and 1 child mapping and not associated, right? so what is the best approach of doing this? HQL? criteria?


0
 

Author Comment

by:roychan0328
ID: 24290138
And by the way, the child doesn't have a PK. How can I map the id field?

0
Space-Age Communications Transitions to DevOps

ViaSat, a global provider of satellite and wireless communications, securely connects businesses, governments, and organizations to the Internet. Learn how ViaSat’s Network Solutions Engineer, drove the transition from a traditional network support to a DevOps-centric model.

 
LVL 40

Accepted Solution

by:
mrjoltcola earned 500 total points
ID: 24290220
>>//load dependents
>>public Parent getParentsById(String key){ ... }

I think you meant:

public Child getChildByParentId(String parentId) { ... }

I would go the criteria route if you have a single key column, I always do it with Hibernate Dao Support class and criteria objects in the typical case. If you need custom SQL I don't know which to suggest, I am not great with HQL so usually choose Spring JdbcTemplate (or raw JDBC if you don't have Spring), because I like to keep it portable in case I change ORMs (which never happens. :) )

>>And by the way, the child doesn't have a PK. How can I map the id field?

Not good. You must add one or identify a composite key based on the columns already in the child table. is parent_row_id + col1 a candidate key?
If not, you can't use Hibernate if the row is not uniquely identified.

I recommend adding a surrogate primary key (a sequence of GUID), otherwise the Hibernate mapping for a composite key is hairier, and requires a domain object to be created for the key to map to.
0
 

Author Comment

by:roychan0328
ID: 24290239
It is a view, so I guess I can't really do anything on the DB side. But I guess I will just use spring Jdbc template. for the child.

Thanks!

0
 
LVL 40

Expert Comment

by:mrjoltcola
ID: 24290330
Which is a view? The child? Tell your DBA to fix the schema! :)

Good luck.
0

Featured Post

Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

I remember the day when someone asked me to create a user for an application developement. The user should be able to create views and materialized views and, so, I used the following syntax: (CODE) This way, I guessed, I would ensure that use…
Checking the Alert Log in AWS RDS Oracle can be a pain through their user interface.  I made a script to download the Alert Log, look for errors, and email me the trace files.  In this article I'll describe what I did and share my script.
This video shows how to copy an entire tablespace from one database to another database using Transportable Tablespace functionality.
This video teaches viewers about errors in exception handling.

726 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question