繁体   English   中英

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

[英]How to retrieve bidirectional association data using Hibernate

我正在尝试检索和打印事件的所有参与者(对于给定的eventId),但是运行代码后,参与者集为空。 这是我的班级和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());
    }
}
}

任何人都可以帮助我解决此问题。 谢谢李

我注意到在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"/>

这些应该相同,并且应该与数据库中的列名相同。 我希望此映射失败,但是会大声失败,因为数据库异常报告未找到某些列或其他列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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