开发者社区> 技术小阿哥> 正文

myeclipse试用小记----Hibernate多对一双向关联(2)

简介:
+关注继续查看
环境、数据库还和上篇文章的一样。只是表中的数据清空了。
 
注意:对于有外键的表,清空数据有两种方法:第一是先drop掉外键约束后,进行清除。第二种是先清除从表数据(orders),然后清除主表的数据(customers),具体我及不说了,有空我在写写数据库外键约束的方面的文章,这点也很重要的。
 
步骤
1、清除orders、customers两表数据。
2、用myeclipse新建web工程sx_d2y,加入hibernate支持。
3、同时选中orders、customers生成实体Bean和mapping文件,并对mapping做小的改动。
4、写两个测试类,分别保存Orders对象和Customers的实体对象,看看能否保存到数据库中。
 
 
废话不说了,看过程吧!
 
一、通过myeclipse生成实体和配置文件:
 
Customers.java
---------------------
public class Customers implements java.io.Serializable {
 
    // Fields
 
    private Long id;
 
    private String name;
 
    private Set orderses = new HashSet(0);
 
    // Constructors
 
    /** default constructor */
    public Customers() {
    }
 
    /** full constructor */
    public Customers(String name, Set orderses) {
        this.name = name;
        this.orderses = orderses;
    }
 
    // Property accessors
 
    public Long getId() {
        return this.id;
    }
 
    public void setId(Long id) {
        this.id = id;
    }
 
    public String getName() {
        return this.name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public Set getOrderses() {
        return this.orderses;
    }
 
    public void setOrderses(Set orderses) {
        this.orderses = orderses;
    }
 
}
 
Orders.java
---------------------
public class Orders implements java.io.Serializable {
 
    // Fields
 
    private Long id;
 
    private Customers customers;
 
    private String orderNumber;
 
    // Constructors
 
    /** default constructor */
    public Orders() {
    }
 
    /** minimal constructor */
    public Orders(Customers customers) {
        this.customers = customers;
    }
 
    /** full constructor */
    public Orders(Customers customers, String orderNumber) {
        this.customers = customers;
        this.orderNumber = orderNumber;
    }
 
    // Property accessors
 
    public Long getId() {
        return this.id;
    }
 
    public void setId(Long id) {
        this.id = id;
    }
 
    public Customers getCustomers() {
        return this.customers;
    }
 
    public void setCustomers(Customers customers) {
        this.customers = customers;
    }
 
    public String getOrderNumber() {
        return this.orderNumber;
    }
 
    public void setOrderNumber(String orderNumber) {
        this.orderNumber = orderNumber;
    }
 
}
 
Customers.hbm.xml
-------------------
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="org.lavasoft.Customers" table="customers">
        <id name="id" type="java.lang.Long">
            <column name="ID" />
            <generator class="increment" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" length="15" />
        </property>
        <set name="orderses" inverse="true" cascade="all-delete-orphan">
            <key>
                <column name="CUSTOMER_ID" not-null="true" />
            </key>
            <one-to-many class="org.lavasoft.Orders" />
        </set>
    </class>
</hibernate-mapping>
 
Orders.hbm.xml
-------------------
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="org.lavasoft.Orders" table="orders" catalog="testdb">
        <id name="id" type="java.lang.Long">
            <column name="ID" />
            <generator class="increment" />
        </id>
        <many-to-one name="customers" class="org.lavasoft.Customers" fetch="select" cascade="save-update">
            <column name="CUSTOMER_ID" not-null="true" />
        </many-to-one>
        <property name="orderNumber" type="java.lang.String">
            <column name="ORDER_NUMBER" length="15" />
        </property>
    </class>
</hibernate-mapping>
 
二、写测试类进行测试
 
在测试之前,先清空这两个关联表的数据。
 
D:\mysql-5.0.37-win32\bin>mysql -uroot -pleizhimin
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 32
Server version: 5.0.37-community MySQL Community Edition (GPL)
 
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
 
mysql> use testdb;
Database changed
mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| card             |
| customers        |
| orders           |
| person           |
| t_user           |
| user             |
+------------------+
6 rows in set (0.00 sec)
 
mysql> delete from orders;
Query OK, 2 rows affected (0.03 sec)
 
mysql> delete from customers;
Query OK, 1 row affected (0.03 sec)
 
看清了,我已经干掉这个两个表的所有数据了。
 
然后,我写一个测试类TestbyOrder,从保存Orders实体对象,看能否级联保存相关的Customers对象:
 
package org.lavasoft;
 
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
 
public class TestbyOrder {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        if(HibernateSessionFactory.getSession()==null)System.out.println("null");
        Session session=HibernateSessionFactory.getSession();
        Transaction tx=session.beginTransaction();
        Customers c=new Customers();
        c.setName("c1");
       
        Orders o1 =new Orders();
        o1.setOrderNumber("11");
        Orders o2 =new Orders();
        o2.setOrderNumber("22");
       
        c.getOrderses().add(o1);
        c.getOrderses().add(o2);
       
        o1.setCustomers(c);
        o2.setCustomers(c);
       
        try {
            session.save(o1);
            session.save(o2);
            //session.save(c);
            tx.commit();
        } catch (HibernateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            tx.rollback();
        }finally{
            session.close();
        }      
    }
 
}
 
运行这个类,控制台信息如下:
Hibernate: select max(ID) from orders
Hibernate: select max(ID) from customers
Hibernate: insert into customers (NAME, ID) values (?, ?)
Hibernate: insert into testdb.orders (CUSTOMER_ID, ORDER_NUMBER, ID) values (?, ?, ?)
Hibernate: insert into testdb.orders (CUSTOMER_ID, ORDER_NUMBER, ID) values (?, ?, ?)
 
从控制台信息发现已经级联保存进去了。
 
在从开库看看,到底写的进去的数据是什么:
mysql> select * from orders;
+----+--------------+-------------+
| ID | ORDER_NUMBER | CUSTOMER_ID |
+----+--------------+-------------+
|  1 | 11           |           1 |
|  2 | 22           |           1 |
+----+--------------+-------------+
2 rows in set (0.00 sec)
 
mysql> select * from customers;
+----+------+
| ID | NAME |
+----+------+
|  1 | c1   |
+----+------+
1 row in set (0.00 sec)
 
mysql>
 
开库查结果表明,写入Orders对象的同时,写入了相关的Customers对象。
 
下面再进行一下反向测试:
 
先清空两个表
 
mysql> delete from orders;
Query OK, 2 rows affected (0.03 sec)
 
mysql>  delete from customers;
Query OK, 1 row affected (0.00 sec)
 
mysql>
 
然后写测试类:
 
package org.lavasoft;
 
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
 
public class TestbyCustomer {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        if(HibernateSessionFactory.getSession()==null)System.out.println("null");
        Session session=HibernateSessionFactory.getSession();
        Transaction tx=session.beginTransaction();
        Customers c=new Customers();
        c.setName("c1");
       
        Orders o1 =new Orders();
        o1.setOrderNumber("11");
        Orders o2 =new Orders();
        o2.setOrderNumber("22");
       
        c.getOrderses().add(o1);
        c.getOrderses().add(o2);
       
        o1.setCustomers(c);
        o2.setCustomers(c);
       
        try {
            session.save(c);
            tx.commit();
        } catch (HibernateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            tx.rollback();
        }finally{
            session.close();
        }      
    }
}
 
运行这个测试类,控制台信息如下:
Hibernate: select max(ID) from customers
Hibernate: select max(ID) from orders
Hibernate: insert into customers (NAME, ID) values (?, ?)
Hibernate: insert into testdb.orders (CUSTOMER_ID, ORDER_NUMBER, ID) values (?, ?, ?)
Hibernate: insert into testdb.orders (CUSTOMER_ID, ORDER_NUMBER, ID) values (?, ?, ?)
 
开库查,看看写入数据是什么:
 
mysql> select * from orders;
+----+--------------+-------------+
| ID | ORDER_NUMBER | CUSTOMER_ID |
+----+--------------+-------------+
|  1 | 11           |           1 |
|  2 | 22           |           1 |
+----+--------------+-------------+
2 rows in set (0.00 sec)
 
mysql> select * from customers;
+----+------+
| ID | NAME |
+----+------+
|  1 | c1   |
+----+------+
1 row in set (0.00 sec)
 
mysql>
 
开库查结果表明,写入Customers对象的同时,写入了相关的Orders对象。
 
从而可以证明:这个双向关联是成功的。
 
呵呵,myeclipse不错,是个好东西。


本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/30164,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
一口一口吃掉Hibernate(六)——多对多关联映射
       今天来说说Hibernate中的多对多关联映射,多对多关联映射涉及到单向映射和双向映射2种。        首先举个多对多关联例子:用户User和角色Role,一个用户可以属于多个角色,一个角色可以有多个用户。
854 0
hibernate笔记--使用注解(annotation)方式配置单(双)向多对一的映射关系
  前面几篇都是介绍的用配置文件来实现实体类到数据库表的映射,这种方式是比较麻烦的,每一个pojo类都需要写一个相应的*.hbm.xml,无疑增加了很多代码量,不过也有优点就是利于维护,为了方便开发,Hibernate还提供了注解方式配置映射文件,非常灵活,减少了配置文件的冗余,虽然维护起来相对比较麻烦,但是的确很方便开发.
936 0
eclipse + JBoss 5 + EJB3开发指南(8):实现Entity Bean的一对多(on
本文为原创,如需转载,请注明作者和出处,谢谢!     EJB3的一对多映射使用@OneToMany来设置,如果是双向的一对多映射,在many方需要使用@ManyToOne设置。
726 0
eclipse中关联文件设置方法
在前几次的试验中,只是做了处于应用程序最上层的界面设计,其实还不知程序在运行过程中到底调用了哪些函数,这些函数是怎么实现的,由于搭建环境时没有进行文件关联,所以在环境中无法实现ctrl键+左击鼠标的方式及时查看类的编写方法。
697 0
eclipse + JBoss 5 + EJB3开发指南(7):实现Entity Bean的一对一(on
本文为原创,如需转载,请注明作者和出处,谢谢!     一对一映射是很常用的。在一般情况下,一个主表通过外键和从表形成一对一的关系。在EJB3中使用@OneToOne注释来映射。
792 0
NHibernate初探(六) 一对多关系级联操作
一对多关系通过外键关系连接两个表,而没有中间的表。 首先先引用一段对集合的释义:   Bag:对象集合,每个元素可以重复。例如{1,2,2,6,0,0},在.Net中相当于IList或者IList实现。
762 0
hibernate笔记--基于主键的单(双)向的一对一映射关系
  上一节介绍的基于外键的一对一映射关系中,在Person表中有一个外键列idCard_id,对应的idCard表的主键id,至于基于主键的一对一映射关系,就是指Person表中抛弃了idcard_id这个外键列,而与idCard表共用一个主键,或者说是其外键为主键的表结构,这种基于主键的双向一对一...
804 0
【SSH快速进阶】——Hibernate 多对一映射 和 一对多映射
上两篇文章说了一对一映射,这里说一下多对一 和 一对多的映射情况。
27 0
13689
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载