简体   繁体   中英

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. Here is my Class and HBM files.

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

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

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

 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:

    <key column="personId"/>
    <many-to-many column="eventId" class="Event"/>

But in your mapping for Event , they have underscore_separated names:

    <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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM