如何使用Hibernate检索双向关联数据

时间:2013-11-03 09:55:06

标签: java hibernate

我正在尝试检索并打印事件的所有参与者(对于给定的eventId),但参与者设置在运行代码后为空。这是我的Class和HBM文件。

班主任:

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>

活动类

 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;
}
 }

主类:

 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());
    }
}
}

任何人请帮我解决这个问题。 谢谢 利

1 个答案:

答案 0 :(得分:0)

我注意到在Person的映射中,使用camelCase名称指定连接表中的列:

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

但是在Event的映射中,它们有下划线名称:

    <key column="event_id"/>
    <many-to-many column="person_id" class="Person"/>

那些应该是相同的,它们应该与数据库中的列名相同。我希望这个映射失败,但失败很大,数据库异常报告没有找到某个列或其他列。