Need help with Hibernate? Read this first:
http://www.hibernate.org/ForumMailingli ... AskForHelp
Hibernate version: Hibernate 3.1 rc2
Mapping documents:
I just setted EAGER fetch type for classes from org.hibernate.test.annotations.onetomany
Code:
@Entity
public class City {
private Integer id;
private String name;
private List<Street> streets;
private List<Street> mainStreets;
@Id(generate=GeneratorType.AUTO)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@OneToMany(mappedBy="city", fetch=FetchType.EAGER)
@OrderBy("streetName, id")
public List<Street> getStreets() {
return streets;
}
public void setStreets(List<Street> streets) {
this.streets = streets;
}
@OneToMany(fetch=FetchType.EAGER)
@JoinColumn(name="mainstreetcity_id")
@OrderBy
public List<Street> getMainStreets() {
return mainStreets;
}
public void setMainStreets(List<Street> streets) {
this.mainStreets = streets;
}
public void addMainStreet(Street street) {
if (mainStreets == null) mainStreets = new ArrayList<Street>();
mainStreets.add(street);
}
}
Code:
@Entity
public class Street {
private Integer id;
private String streetName;
private City city;
@Id(generate=GeneratorType.AUTO)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getStreetName() {
return streetName;
}
public void setStreetName(String streetName) {
this.streetName = streetName;
}
@ManyToOne
public City getCity() {
return city;
}
public void setCity(City city) {
this.city = city;
}
}
Code between sessionFactory.openSession() and session.close():Code:
public void testCriteria() throws Exception {
Session s;
Transaction tx;
s = openSession();
tx = s.beginTransaction();
City paris = new City();
paris.setName("Paris");
s.persist(paris);
Street rochechoir = new Street();
rochechoir.setStreetName("Rochechoir");
rochechoir.setCity(paris);
Street chmpsElysees = new Street();
chmpsElysees.setStreetName("Champs Elysees");
chmpsElysees.setCity(paris);
Street grandeArmee = new Street();
grandeArmee.setStreetName("Grande Arm�e");
grandeArmee.setCity(paris);
s.persist(rochechoir);
s.persist(chmpsElysees);
s.persist(grandeArmee);
paris.addMainStreet(chmpsElysees);
paris.addMainStreet(grandeArmee);
tx.commit();
s.clear();
tx = s.beginTransaction();
List<City> citiesFromCriteria = (List<City>) s.createCriteria(City.class).list();
assertEquals(1, citiesFromCriteria.size()); //fails junit.framework.AssertionFailedError: expected:<1> but was:<6>
tx.commit();
s.close();
Debug level Hibernate log excerpt:
13:50:30,060 DEBUG SQL:344 - select this_.id as id0_2_, this_.name as name0_2_, streets2_.city_id as city3_4_, streets2_.id as id4_, streets2_.id as id1_0_, streets2_.streetName as streetName1_0_, streets2_.city_id as city3_1_0_, mainstreet3_.mainstreetcity_id as mainstre4_5_, mainstreet3_.id as id5_, mainstreet3_.id as id1_1_, mainstreet3_.streetName as streetName1_1_, mainstreet3_.city_id as city3_1_1_ from City this_ left outer join Street streets2_ on this_.id=streets2_.city_id left outer join Street mainstreet3_ on this_.id=mainstreet3_.mainstreetcity_id order by streets2_.streetName asc, streets2_.id asc, mainstreet3_.id asc
13:50:30,073 DEBUG IntegerType:123 - returning '2' as column: id1_0_
13:50:30,074 DEBUG IntegerType:123 - returning '2' as column: id1_1_
13:50:30,075 DEBUG IntegerType:123 - returning '1' as column: id0_2_
13:50:30,077 DEBUG StringType:123 - returning 'Champs Elysees' as column: streetName1_0_
13:50:30,078 DEBUG IntegerType:123 - returning '1' as column: city3_1_0_
13:50:30,079 DEBUG StringType:123 - returning 'Paris' as column: name0_2_
13:50:30,082 DEBUG IntegerType:123 - returning '1' as column: city3_4_
13:50:30,086 DEBUG IntegerType:123 - returning '2' as column: id4_
13:50:30,089 DEBUG IntegerType:123 - returning '1' as column: mainstre4_5_
13:50:30,090 DEBUG IntegerType:123 - returning '2' as column: id5_
13:50:30,091 DEBUG IntegerType:123 - returning '2' as column: id1_0_
13:50:30,092 DEBUG IntegerType:123 - returning '3' as column: id1_1_
13:50:30,092 DEBUG IntegerType:123 - returning '1' as column: id0_2_
13:50:30,094 DEBUG StringType:123 - returning 'Grande Arm�e' as column: streetName1_1_
13:50:30,095 DEBUG IntegerType:123 - returning '1' as column: city3_1_1_
13:50:30,096 DEBUG IntegerType:123 - returning '1' as column: city3_4_
13:50:30,097 DEBUG IntegerType:123 - returning '2' as column: id4_
13:50:30,097 DEBUG IntegerType:123 - returning '1' as column: mainstre4_5_
13:50:30,099 DEBUG IntegerType:123 - returning '3' as column: id5_
13:50:30,099 DEBUG IntegerType:123 - returning '3' as column: id1_0_
13:50:30,100 DEBUG IntegerType:123 - returning '2' as column: id1_1_
13:50:30,101 DEBUG IntegerType:123 - returning '1' as column: id0_2_
13:50:30,102 DEBUG IntegerType:123 - returning '1' as column: city3_4_
13:50:30,104 DEBUG IntegerType:123 - returning '3' as column: id4_
13:50:30,105 DEBUG IntegerType:123 - returning '1' as column: mainstre4_5_
13:50:30,106 DEBUG IntegerType:123 - returning '2' as column: id5_
13:50:30,106 DEBUG IntegerType:123 - returning '3' as column: id1_0_
13:50:30,107 DEBUG IntegerType:123 - returning '3' as column: id1_1_
13:50:30,108 DEBUG IntegerType:123 - returning '1' as column: id0_2_
13:50:30,108 DEBUG IntegerType:123 - returning '1' as column: city3_4_
13:50:30,109 DEBUG IntegerType:123 - returning '3' as column: id4_
13:50:30,111 DEBUG IntegerType:123 - returning '1' as column: mainstre4_5_
13:50:30,112 DEBUG IntegerType:123 - returning '3' as column: id5_
13:50:30,113 DEBUG IntegerType:123 - returning '1' as column: id1_0_
13:50:30,121 DEBUG IntegerType:123 - returning '2' as column: id1_1_
13:50:30,122 DEBUG IntegerType:123 - returning '1' as column: id0_2_
13:50:30,122 DEBUG StringType:123 - returning 'Rochechoir' as column: streetName1_0_
13:50:30,123 DEBUG IntegerType:123 - returning '1' as column: city3_1_0_
13:50:30,124 DEBUG IntegerType:123 - returning '1' as column: city3_4_
13:50:30,125 DEBUG IntegerType:123 - returning '1' as column: id4_
13:50:30,127 DEBUG IntegerType:123 - returning '1' as column: mainstre4_5_
13:50:30,128 DEBUG IntegerType:123 - returning '2' as column: id5_
13:50:30,128 DEBUG IntegerType:123 - returning '1' as column: id1_0_
13:50:30,129 DEBUG IntegerType:123 - returning '3' as column: id1_1_
13:50:30,130 DEBUG IntegerType:123 - returning '1' as column: id0_2_
13:50:30,130 DEBUG IntegerType:123 - returning '1' as column: city3_4_
13:50:30,131 DEBUG IntegerType:123 - returning '1' as column: id4_
13:50:30,132 DEBUG IntegerType:123 - returning '1' as column: mainstre4_5_
13:50:30,134 DEBUG IntegerType:123 - returning '3' as column: id5_
It seems select produces a 6 rows result but why each row returned as a separate entity? There is only one City in fact.