J度空间

myeclipse试用小记----多对一单向关联(1)

转自:http://lavasoft.blog.51cto.com/62575/d-5


说明:一个客户可以对应多个订单。以此为例说明用myeclipse如何来实现这个应用,看看myeclipse是如何做的,生成配置文件质量如何。

 

环境

开发工具:myeclipse 5.5.1 GA

数 据 库:mysql-5.0.37

操作系统:windows xp professional 中文版

 

步骤

1、建立mysql5数据库testdb,脚本下面已经给出。

2、配置myeclipse的数据库服务器,并建立名称为mysql5的数据库链接。

3、建议myeclipseweb工程,名称为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"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<!--
    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"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<!--
    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>

三、写测试类进行测试:
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"

posted on 2007-08-01 23:59 蓝色幽默 阅读(470) 评论(0)  编辑  收藏 所属分类: Hibernate

导航

<2025年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

统计

常用链接

留言簿(4)

随笔分类

文章分类

相册

搜索

最新评论