Solved

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

Posted on 2009-05-02
6
635 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
  • 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
How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

 
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

Maximize Your Threat Intelligence Reporting

Reporting is one of the most important and least talked about aspects of a world-class threat intelligence program. Here’s how to do it right.

Join & Write a Comment

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…
Go is an acronym of golang, is a programming language developed Google in 2007. Go is a new language that is mostly in the C family, with significant input from Pascal/Modula/Oberon family. Hence Go arisen as low-level language with fast compilation…
This video shows syntax for various backup options while discussing how the different basic backup types work.  It explains how to take full backups, incremental level 0 backups, incremental level 1 backups in both differential and cumulative mode a…
This video shows how to Export data from an Oracle database using the Original Export Utility.  The corresponding Import utility, which works the same way is referenced, but not demonstrated.

762 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

Need Help in Real-Time?

Connect with top rated Experts

23 Experts available now in Live!

Get 1:1 Help Now