Hibernated多表查询

1.创建一个人的简单实体类Person

人有姓名,有年龄,有ID,并且人会做事(关联Event),
package org.grgbanking.pojo;

import java.util.HashSet;
import java.util.Set;
/**
 * 
 * @author cjyun
 * @Date 2016年11月22日
 */
public class Person {
    private String id;
    private int age;
    private String firstname;
    private String lastname;
    private Set events = new HashSet();

    public Set getEvents() {
        return events;
    }

    public void setEvents(Set events) {
        this.events = events;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public Person(String id, int age, String firstname, String lastname) {
        super();
        this.id = id;
        this.age = age;
        this.firstname = firstname;
        this.lastname = lastname;
    }

    public Person() {
        super();
        // TODO Auto-generated constructor stub
    }

    @Override
    public String toString() {
        return "Person [id=" + id + ", firstname=" + firstname + ", lastname=" + lastname + ", events="
                + events.toString() + "]";
    }

}

在代码中就可以看出,人与事件并不是直接关联的,而是采用一个中间表进行联系,只需要在数据库中建立一张表Person_Event,字段有person_id和Event_id ,就可以把人和事通过对应的ID关联起来,因为关联表不是一个实际的表,因此不需要创建一个实体类。

2.hibernate的person表映射

<?xml version="1.0" encoding="UTF-8"?>
<hibernate-mapping package="org.grgbanking.pojo">

    <class name = "Person" table = "PERSON">
        <id name = "id" column = "PERSON_ID"/>
        <property name = "age" column = "AGE"></property>
        <property name = "firstname" column = "FIRSTNAME"/>
        <property name = "lastname" column = "LASTNAME"/>
        <set name="events" table="PERSON_EVENT">
            <key column="PERSON_ID"/>
            <many-to-many column="EVENT_ID" class="Event"/>
        </set>

    </class>
</hibernate-mapping>

最后别忘了在hibernate的配置文件中添加person的映射

<mapping resource="org/grgbanking/mapping/PersonMapping.xml" />

3.测试

hibernate的具体配置跟上一篇的大致一样,只是多加了person的映射,因此可以参考初学Hibernate,简单实现单表的增删查改

建立一个简单main方法EventManager

/**
*
* @author cjyun
* @Date 2016年11月22日
*/
public class EventManager {

public static void main(String[] args) {
    addPersonToEvent("123","888438d0-3494-407c-8892-23801cbe296f");

}
private static void addPersonToEvent(String personId, String eventId){
    Session session = HibernateUtil.getSessionfactory().getCurrentSession();
    session.beginTransaction();

    Person person = (Person) session.createQuery("select p from Person p left join fetch p.events where p.id=:pid")
             .setParameter("pid", personId)
             .uniqueResult();
    System.out.println("-------------------1-----------"+person.toString());
     Event anEvent = (Event) session.load(Event.class,eventId);
     session.getTransaction().commit();
     person.getEvents().add(anEvent);

     Session session2 = HibernateUtil.getSessionfactory().getCurrentSession();
     session2.beginTransaction();
     person.setFirstname("刘");

     session2.update(person); // Reattachment of aPerson
     session2.getTransaction().commit();

}

}
“`

4.别忘了加入日志系统,可以更好进行观察。

5.总结

hibernate的多表查询,关键一点是要在表与实体类的映射文件中配置相关信息,比如<set name="events" table="PERSON_EVENT">
<key column="PERSON_ID"/>
<many-to-many column="EVENT_ID" class="Event"/>
</set>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值