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、建議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
------------------------------------
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;
}
}
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
<!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
<!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.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 藍色幽默 閱讀(467) 評論(0) 編輯 收藏 所屬分類: Hibernate