简体   繁体   English

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

[英]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.

相关问题 如何从Java Spring中的Hibernate双向OneToMany ManyToOne中检索数据 - How to retrieve data from Hibernate bidirectional OneToMany ManyToOne in Java Spring 如何在休眠中正确设置双向关联@OneToMany - How to properly set bidirectional association @OneToMany in hibernate 如何使用 Spring 数据 JPA 在不级联的情况下保存双向关联? - How to save bidirectional association without cascading using Spring data JPA? 休眠一对多双向关联,不使用Spring Data加载 - Hibernate one to many bidirectional association not loading with Spring Data 如何在双向关联上禁用 Hibernate 外键约束? - How do I disable Hibernate foreign key constraint on a bidirectional association? 休眠双向关联,主键为外键 - hibernate bidirectional association with primary key as foreign key 具有@OneToMany双向关联的Hibernate映射映射 - Hibernate mapping map with @OneToMany bidirectional association 如何在DAO中检索关联数据? - how to retrieve association data in DAO? Hibernate和TomEE +双向关联导致json递归 - Hibernate and TomEE+ bidirectional association causes json recursiveness 为什么hibernate执行两个查询以急切加载@OneToOne双向关联? - Why hibernate perform two queries for eager load a @OneToOne bidirectional association?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM