We help IT Professionals succeed at work.

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

roychan0328
roychan0328 asked
on
672 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!
Comment
Watch Question

Top Expert 2009

Commented:
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

Author

Commented:
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?


Author

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

Top Expert 2009
Commented:
This one is on us!
(Get your first solution completely free - no credit card required)
UNLOCK SOLUTION

Author

Commented:
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!

Top Expert 2009

Commented:
Which is a view? The child? Tell your DBA to fix the schema! :)

Good luck.
Unlock the solution to this question.
Join our community and discover your potential

Experts Exchange is the only place where you can interact directly with leading experts in the technology field. Become a member today and access the collective knowledge of thousands of technology experts.

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.