[英]How to retrieve bidirectional association data using Hibernate
I am trying to retrieve and print all the participants of the event (for the given eventId), But the Participants set is empty after running the code. 我正在尝试检索和打印事件的所有参与者(对于给定的eventId),但是运行代码后,参与者集为空。 Here is my Class and HBM files.
这是我的班级和HBM文件。
Class Person: 班级人员:
public class Person {
private long personId;
private String firstName;
private String lastName;
private int age;
private Set<Event> myEvents=new HashSet<Event>();
public Person() {
}
/**
* @return the personId
*/
public long getPersonId() {
return personId;
}
/**
* @param personId the personId to set
*/
public void setPersonId(long personId) {
this.personId = personId;
}
/**
* @return the firstName
*/
public String getFirstName() {
return firstName;
}
/**
* @param firstName the firstName to set
*/
public void setFirstName(String firstName) {
this.firstName = firstName;
}
/**
* @return the lastName
*/
public String getLastName() {
return lastName;
}
/**
* @param lastName the lastName to set
*/
public void setLastName(String lastName) {
this.lastName = lastName;
}
/**
* @return the age
*/
public int getAge() {
return age;
}
/**
* @param age the age to set
*/
public void setAge(int age) {
this.age = age;
}
/**
* @return the myEvents
*/
public Set getMyEvents() {
return myEvents;
}
/**
* @param myEvents the myEvents to set
*/
public void setMyEvents(Set myEvents) {
this.myEvents = myEvents;
}
}
HBM HBM
<hibernate-mapping package="com.lc.learn.hibernate.sample.beans">
<class name="Person" table="person">
<id name="personId" column="person_id" type="long">
<generator class="increment"/>
</id>
<property name="firstName" column="first_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
<property name="age" column="age" type="integer"/>
<set name="myEvents" table="person_events" inverse="false" lazy="false" fetch="select" cascade="all">
<key column="personId"/>
<many-to-many column="eventId" class="Event"/>
</set>
</class>
</hibernate-mapping>
Event Class 活动类
public class Event {
private long eventId;
private String eventTitle;
private Date eventDate;
private Set<Person> personList=new HashSet<Person>();
public Event() {
}
public Event(String eventTitle, Date eventDate) {
this.eventTitle = eventTitle;
this.eventDate = eventDate;
}
/**
* @return the eventId
*/
public long getEventId() {
return eventId;
}
/**
* @param eventId the eventId to set
*/
public void setEventId(long eventId) {
this.eventId = eventId;
}
/**
* @return the eventTitle
*/
public String getEventTitle() {
return eventTitle;
}
/**
* @param eventTitle the eventTitle to set
*/
public void setEventTitle(String eventTitle) {
this.eventTitle = eventTitle;
}
/**
* @return the eventDate
*/
public Date getEventDate() {
return eventDate;
}
/**
* @param eventDate the eventDate to set
*/
public void setEventDate(Date eventDate) {
this.eventDate = eventDate;
}
/**
* @return the personList
*/
public Set getPersonList() {
return personList;
}
/**
* @param personList the personList to set
*/
public void setPersonList(Set personList) {
this.personList = personList;
}
}
HBM : HBM:
<hibernate-mapping package="com.lc.learn.hibernate.sample.beans">
<class name="Event" table="event">
<id name="eventId" column="event_id" type="long">
<generator class="increment"/>
</id>
<property name="eventTitle" column="event_title" type="string"/>
<property name="eventDate" column="event_date" type="timestamp"/>
<set name="personList" table="person_events" inverse="true" lazy="false" fetch="select">
<key column="event_id"/>
<many-to-many column="person_id" class="Person"/>
</set>
</class>
</hibernate-mapping>
DAL : DAL:
public class EventManager {
public Event getEventById(long eventId){
Event eObj=null;
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx=session.getTransaction();
tx.begin();
eObj=(Event)session.get(Event.class, eventId);
eObj.setPersonList(eObj.getPersonList());
//Hibernate.initialize(eObj.getPersonList());
tx.commit();
return eObj;
}
}
Main Class: 主类:
public class MyHibernateSample {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
EventManager eManager=new EventManager();
Event eObj= eManager.getEventById(1);
Iterator it=eObj.getPersonList().iterator();
while(it.hasNext()){
Person pObj=(Person)it.next();
System.out.println("First Name : "+pObj.getFirstName()+" Last Name : "+pObj.getLastName()+" Age : "+pObj.getAge());
}
}
}
Any one please help me to resolve this issue. 任何人都可以帮助我解决此问题。 Thanks Lee
谢谢李
I note that in your mapping for Person
, you specify the columns in the join table with camelCase names: 我注意到在
Person
的映射中,您使用camelCase名称指定了联接表中的列:
<key column="personId"/>
<many-to-many column="eventId" class="Event"/>
But in your mapping for Event
, they have underscore_separated names: 但是在
Event
的映射中,它们具有下划线分隔的名称:
<key column="event_id"/>
<many-to-many column="person_id" class="Person"/>
Those should be the same, and they should be the same as the column names in the database. 这些应该相同,并且应该与数据库中的列名相同。 I would expect this mapping to fail, but to fail quite loudly, with a database exception reporting that some column or other was not found.
我希望此映射失败,但是会大声失败,因为数据库异常报告未找到某些列或其他列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.