Solved

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

Posted on 2009-05-02
6
637 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
PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

 
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

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
groupNoAdj 7 84
why cannot we forward request once the response is committed 2 33
Oracle sql query 7 40
java stored proc example 9 19
Cursors in Oracle: A cursor is used to process individual rows returned by database system for a query. In oracle every SQL statement executed by the oracle server has a private area. This area contains information about the SQL statement and the…
Introduction This article is the first of three articles that explain why and how the Experts Exchange QA Team does test automation for our web site. This article explains our test automation goals. Then rationale is given for the tools we use to a…
This video shows how to Export data from an Oracle database using the Datapump Export Utility.  The corresponding Datapump Import utility is also discussed and demonstrated.
This video shows how to copy an entire tablespace from one database to another database using Transportable Tablespace functionality.

914 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

16 Experts available now in Live!

Get 1:1 Help Now