• Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other Pie Elite all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Campbell Ritchie
  • Jeanne Boyarsky
  • Ron McLeod
  • Paul Clapham
  • Liutauras Vilda
Sheriffs:
  • paul wheaton
  • Rob Spoor
  • Devaka Cooray
Saloon Keepers:
  • Stephan van Hulst
  • Tim Holloway
  • Carey Brown
  • Frits Walraven
  • Tim Moores
Bartenders:
  • Mikalai Zaikin

Hibernate - multiple collection with restrictions mapping problem

 
Greenhorn
Posts: 7
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Hello, I have a problem concerning mapping of multiple collections.
Lets's say I want to have a List of ZOO's objects.
I have a table called "zoo" with two fields:
id - id of ZOO
name - name of ZOO

Simple export from this table could look like this:
id:1 ; name:ZOO1
id:2 ; name:ZOO2
id:3 ; name:ZOO3


Then I have second table - "Animals" with four fields:
id - id of animal
zoo_id - id of zoo (this is a FK)
animal_type - describes type of animal (there can by only four types of animals: dog, cat, fish, bird)
animal_name - name of animal

A simple export from this table could look as below:
id:1 ; zoo_id:1 ; animal_type og ; animal_name: doggy1
id:2 ; zoo_id:1 ; animal_type og ; animal_name: doggy2
id:3 ; zoo_id:1 ; animal_type:cat ; animal_name: cat1
id:4 ; zoo_id:2 ; animal_type:cat ; animal_name: cat2
id:5 ; zoo_id:2 ; animal_type:fish ; animal_name: fishy1
id:6 ; zoo_id:2 ; animal_type:bird ; animal_name: bird1

Now, I want to have Java class called "ZOO" as follows:

class Zoo{
Set dogs; //can be a Hashset
Set cats;
Set fish;
Set birds;
//I ommitt the rest of the listing of this class
}

Finally, I would like to retrieve from DB the list of ZOO's with eager-fetched animals just by calling
List zooList = session.createCriteria(Zoo.class).list();


As a result I should get List with two elements
element1 - object corresponding to ZOO1 (Set dogs should contain 2 elements ; Set cats should contain 1 elements ; Set fish should contain 0 elements ; Set birds should contain 0 elements)
element2 - object corresponding to ZOO2 (Set dogs should contain 0 elements ; Set cats should contain 1 elements ; Set fish should contain 1 elements ; Set birds should contain 1 elements)

Could you please advise me how to map tables/classes etc.?
 
Sheriff
Posts: 10445
227
IntelliJ IDE Ubuntu
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Here's just a sample. There might be more ways of doing this.

Zoo.hbm.xml:



Animal.hbm.xml:
 
mat novak
Greenhorn
Posts: 7
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Hello,
thank you for reply.
Still I do something wrong.
According to suggestion above, I did a mapping as shown below (I show only mapping for Zoo's):

Zoo.hbm.xml:

code:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >

<hibernate-mapping>

<class
name="org.myapp.hibernateobject.Zoo"
table="ZOO"
>

<id>
.....
</id>

<property
name="name"
type="java.lang.String"
column="Name"

>
</property>

<set name="cats" lazy="false" inverse="true" cascade="all-delete-orphan">
<key>
<column name="id" />
</key>

<one-to-many class="org.myapp.hibernateobject.Cat" />
</set>

<set name="dogs" lazy="false" inverse="true" cascade="all-delete-orphan">
<key>
<column name="id" />
</key>

<one-to-many class="org.myapp.hibernateobject.Dog" />
</set>

<set name="fish" lazy="false" inverse="true" cascade="all-delete-orphan">
<key>
<column name="id" />
</key>

<one-to-many class="org.myapp.hibernateobject.Fish" />
</set>




</class>
</hibernate-mapping>



And if I call Cat/Dog/Fish class explicitly everything is ok.
i.e.
Criteria criteria = session.createCriteria(Cat.class);
List projects = criteria.list();

produces SQL like this (I simplified this a little):
(ble ble ble) where Animal_Type='Cat' (so the proper mapping is chosen)

But if I call a list of ZOO's
List zooList = session.createCriteria(Zoo.class).list();

for every collection declared in ZOO class (that is: Set dogs; Set cats; Set fish generated SQL looks as follows:

(ble ble ble) where zoo_id=?

and there is missing part " and Animal_Type='Cat' "

Could you please tell me what do I do wrong?
 
Consider Paul's rocket mass heater.
reply
    Bookmark Topic Watch Topic
  • New Topic