现在的位置: 首页 > 综合 > 正文

Hibernate多对一单向关联(1)

2018年01月24日 ⁄ 综合 ⁄ 共 7678字 ⁄ 字号 评论关闭
说明:一个客户可以对应多个订单。以此为例说明用myeclipse如何来实现这个应用,看看myeclipse是如何做的,生成配置文件质量如何。
 
环境
开发工具:myeclipse 5.5.1 GA
数 据 库:mysql-5.0.37
操作系统:windows xp professional 中文版
 
步骤
1、建立mysql5数据库testdb,脚本下面已经给出。
2、配置myeclipse的数据库服务器,并建立名称为mysql5的数据库链接。
3、建议myeclipse的web工程,名称为dx_d2y,并加入hibernate支持,选择hibernate3.1,最高就支持到3.1。
4、在myeclipse的数据库视图中链接数据库并通过表生成实体PO和配置文件,中间不生成DAO。
5、检查配置文件的正确性,然后测试类进行测试。
 
 
一、建立数据库的脚本:
 
alter table orders drop foreign key fk_order_customer;
drop table if exists customers;
drop table if exists orders;
create table customers (
   id bigint not null,
   name varchar(15),
   primary key (id)
);
create table orders (
   id bigint not null,
   order_number varchar(15),
   customer_id bigint not null,
   primary key (id)
);
alter table orders add index fk_order_customer(customer_id), add constraint fk_order_customer
foreign key (customer_id) references customers (id);
 
表关系的逻辑图:
+-----------+                    +--------------+
| customers |                    | oreders      |
+-----------+                    +--------------+
| ID        |<------|            | ID           |
| NAME      |       |            | ORDER_NUMBER |
+-----------+       |------------| CUSTOMER_ID  |
                                 +--------------+
 
特别注意:因为有外键约束,需要事务支持,在安装数据库的时候,需要配置mysql数据库服务器的参数。数据库的引擎应该用InnoDB,关闭了自动提交模式,也就是SET
AUTOCOMMIT=0。
 
my.ini
------------------------------------
#[WinMySQLAdmin]
#Server=D:/mysql-5.0.37-win32/bin/mysqld.exe
 
[mysqld]
# set basedir to your installation path
#basedir=D:/mysql-5.0.37-win32
# set datadir to the location of your data directory
port = 3306
key_buffer = 16K
max_allowed_packet = 1M
table_cache = 4
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 64K
datadir=data
default-character-set=gbk
init_connect='SET AUTOCOMMIT=0'
default-table-type=InnoDB
init_connect='set completion_type=1'
 
[client]
default-character-set=gbk
------------------------------------
 
二、通过myeclipse生成实体和配置文件:
 
Customers.java
---------------------
public class Customers implements java.io.Serializable {
 
    // Fields
 
    private Long id;
 
    private String name;
 
    // Constructors
 
    /** default constructor */
    public Customers() {
    }
 
    /** full constructor */
    public Customers(String name) {
        this.name = name;
    }
 
    // 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;
    }
}
 
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>
    </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">
        <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>
 
三、写测试类进行测试:
---------------------
package org.lavasoft;
 
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
 
public class Test {
 
    /**
     * @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("c1");
        Orders o1 =new Orders();
        o1.setOrderNumber("11");
        Orders o2 =new Orders();
        o2.setOrderNumber("22");   
 
        o1.setCustomers(c);
        o2.setCustomers(c);
       
        try {
            session.save(o1);
            session.save(o2);
            tx.commit();
        } catch (HibernateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
           
tx.rollback();
        }finally{
            session.close();
        }
       
    }
}
 
四、运行测试类Test,控制台打印信息:
------------------------------------------
Hibernate: select max(ID) from orders
Hibernate: select max(ID) from customers
Hibernate: insert into customers (NAME, ID) values (?, ?)
Hibernate: insert into orders (CUSTOMER_ID, ORDER_NUMBER, ID) values (?, ?, ?)
Hibernate: insert into orders (CUSTOMER_ID, ORDER_NUMBER, ID) values (?, ?, ?)
 
 
查看数据库:
------------------------------------------
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 10
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> describe customers;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| ID    | bigint(20)  | NO   | PRI |         |       |
| NAME  | varchar(15) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
 
mysql> describe orders;
+--------------+-------------+------+-----+---------+-------+
| Field        | Type        | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| ID           | bigint(20)  | NO   | PRI |         |       |
| ORDER_NUMBER | varchar(15) | YES  |     | NULL    |       |
| CUSTOMER_ID  | bigint(20)  | NO   | MUL |         |       |
+--------------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
 
mysql> select * from customers;
+----+------+
| ID | NAME |
+----+------+
|  1 | c1   |
+----+------+
1 row in set (0.00 sec)
 
mysql> select * from orders;
+----+--------------+-------------+
| ID | ORDER_NUMBER | CUSTOMER_ID |
+----+--------------+-------------+
|  1 | 11           |           1 |
|  2 | 22           |           1 |
+----+--------------+-------------+
2 rows in set (0.00 sec)
 
mysql>
 
总结:从上面过程可以看出,myeclipse实现这个单向多对一的过程非常的简单,虽然是自动生成的SessionFactory和hibernate.cfg.xml但是没有一点问题。这就省去了大量的工作量。并且生成的映射文件和实体Bean(也叫PO,有很多叫法)质量也不错,基本上不需要什么改动。在此实现过程中,需要改动地方有:
1、生成的指定数据库testdb要删除掉,因为连接字符串里面有。
2、在orders.hbm.xml中默认不会自动设置级联保存和更新,可以自己加上cascade="save-update"。



 
 

本文出自 “熔 岩” 博客,转载请与作者联系!

抱歉!评论已关闭.