hibernate的one-to-many

1.one-to-many 的单向
one-to-many的单向是指在一端维护关系,一端用set存储多端对象,由于one-to-many 在添加或维护关系时比较麻烦,开发中不建议使用one-to-many的单向。
one-to-many 的单向如何表示,举例说明一下
一对多关系:Message (留言)和Comment(评论)
实例如下:
Message对象:

public Class Message{
    private int id;
    private String title;
    private String content;
    private Set<Comment> comments;
    (getter和setter方法)
    }

Comment对象:

public Class Comment{
    private int id;
    private String content;
    (getter和setter方法)
    }

hibernate的配置如下
Message.hbm.xml:

<hibernate-mapping package="bo">
    <class name="Message" table="t_msg">
        <id name="id">
            <generator class="native" />
        </id>
        <property name="title" />
        <property name="content" />
        <!-- lazy="extra",会稍微智能一点,会根据取值不同判断是调用count和获取投影 -->
        <set name="comments"  lazy="extra">
        <!-- key 用来指定在对方的外键的名称 -->
        <key column="msgId"/>
        <!-- class用来设置列表中的对象类型 -->
        <one-to-many class="Comment" />
        </set>
    </class>
</hibernate-mapping>

Comment.hbm.xml:

<hibernate-mapping package="bo">
    <class name="Comment" table="t_comment">
        <id name="id">
            <generator class="native" />
        </id>
        <property name="content" />
    </class>
</hibernate-mapping>

测试类实现:
效率不高

    @Test
    public void testAdd(){
        Session session=null;
        try{
            session=HibernateUtil.openSession();
            session.beginTransaction();
            Comment c1=new Comment();
            c1.setContent("123432343");
            Comment c2=new Comment();
            c2.setContent("sssss");
            session.save(c1);
            session.save(c2);
            Message msg=new Message();
            msg.setTitle("ssss");
            msg.setContent("agbdfjeirje");
            msg.addComment(c1);
            msg.addComment(c2);
            session.save(msg);
            session.getTransaction().commit();
        }catch(Exception e){
            e.printStackTrace();
            if(session!=null) session.getTransaction().rollback();
        }finally{
            if(session!=null) session.close();
        }
    }
    /**
     * 执行结果:Hibernate: insert into t_comment (content) values (?)
                Hibernate: insert into t_comment (content) values (?)
                Hibernate: insert into t_msg (title, content) values (?, ?)
                Hibernate: update t_comment set msgId=? where id=?
                Hibernate: update t_comment set msgId=? where id=?
     */
    @Test
    public void testLoad(){
        Session session=null;
        try{
            session=HibernateUtil.openSession();
            Message msg=(Message) session.load(Message.class, 1);
            System.out.println(msg.getContent());
            for(Comment comment:msg.getComments()){
                System.out.println(comment.getContent());
            }
            /**
             * 执行结果
             * Hibernate: select message0_.id as id4_0_, message0_.title as title4_0_, message0_.content as content4_0_ from t_msg message0_ where message0_.id=?
                agbdfjeirje
                Hibernate: select comments0_.msgId as msgId4_1_, comments0_.id as id5_1_, comments0_.id as id5_0_, comments0_.content as content5_0_ from t_comment comments0_ where comments0_.msgId=?
                sssss
                123432343
             */
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            if(session!=null) session.close();
        }
    }
    //特别注意:oneToMany 在添加和维护关系比较麻烦,所以开发包中不建议使用one-to-Many的单向

2.one-to-many 的双向
学生和班级的关系是一对多的关系,在Student实体类这方加入属性为ClassRoom classRoom,在ClassRoom这端增加Set students,同时配置文件增加:
最佳实践就是不要使用1的一方来维护关系,在配置文件的set标签中可以通过inverse=true来明确不使用一的这一端维护关系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值