myeclipse试用小记----Hibernate多对一双向关联(2)
在上篇文章“myeclipse试用小记----Hibernate多对一单向关联(1)”中,讲到了“Hibernate多对一单向关联”,现在我打算把这个做成双向的,也就是多对一双向关联,看看myeclipse是如何实现的。
环境、数据库还和上篇文章的一样。只是表中的数据清空了。
注意:对于有外键的表,清空数据有两种方法:第一是先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"
"[url]http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd[/url]">
<!--
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"
"[url]http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd[/url]">
<!--
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不错,是个好东西。
myeclipse试用小记----Hibernate多对一单向关联(1)

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

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

    myeclipse试用小记----Hibernate多对一双向关联(2) 在上篇文章"myeclipse试用小记----Hibernate多对一单向关联(1)"中,讲到了" ...

  2. Hibernate多对多双向关联需要注意的问题(实例说话)

    以Student和Course为例,一个学生可以选多门课程,一门课程也可以被多个学生选取: 持久化类Student: [java] view plain copy package bean; impo ...

  3. [置顶] Hibernate从入门到精通(十一)多对多双向关联映射

    上次我们在中Hibernate从入门到精通(十)多对多单向关联映射讲解了一下多对多单向关联映射,这次我们讲解一下七种映射中的最后一种多对多双向关联映射. 多对多双向关联映射 按照我们之前的惯例,先看一 ...

  4. Hibernate,关系映射的多对一单向关联、多对一双向关联、一对一主键关联、一对一外键关联、多对多关系关联...

    2018-11-10  22:27:02开始写 下图内容ORM.Hibernate介绍.hibername.cfg.xml结构: 下图内容hibernate映射文件结构介绍 下图内容hibernate ...

  5. 【Hibernate步步为营】--双向关联一对一映射具体解释(一)

    一对一的映射在对象模型中是常常见到的,为了将对象模型转换为关系模型就必须在映射文件里进行配置,上篇文章讨论了一对一映射的单向关联的情况,重点是<one-to-one>标签的使用,须要在映射 ...

  6. Hibernate映射详解(二)--多对一,一对多单向,一对多双向关联映射

    在我们以前的数据库设计中,设计表就不是一件轻松的事情.多种事物之间往往都是有这样那样的关系的.那怎样设计表格,才能既将事情描述明白,又能使数据库设计的比较合理呢?那里我们提供了好多规范,好多约束来满足 ...

  7. [置顶] Hibernate从入门到精通(十)多对多单向关联映射

    上一篇文章Hibernate从入门到精通(九)一对多双向关联映射中我们讲解了一下关于一对多关联映射的相关内容,这次我们继续多对多单向关联映射. 多对多单向关联映射 在讲解多对多单向关联映射之前,首先看 ...

  8. Hibernate从入门到精通(十)多对多单向关联映射

    上一篇文章Hibernate从入门到精通(九)一对多双向关联映射中我们讲解了一下关于一对多关联映射的相关内容,这次我们继续多对多单向关联映射. 多对多单向关联映射 在讲解多对多单向关联映射之前,首先看 ...

  9. JPA规范:一对多、一对一、多对多的双向关联与级联操作以及JPA联合主键

    通常在企业开发中,开发Dao层有两种做法:  (1)先建表,后再根据表来编写配置文件和实体bean.使用这种方案的开发人员受到了传统数据库建模的影响.  (2)先编写配置文件和实体bean,然后再生成 ...

最新文章

  1. SLAM精度测评——EVO进阶
  2. python爬取新闻后提炼_Python爬虫开发的3大难题,别上了贼船才发现,水有多深...
  3. 《Spark大数据分析:核心概念、技术及实践》一1.5 NoSQL
  4. [转载]交换机背板带宽计算方法
  5. C语言实现哈希表(附完整源码)
  6. 如何访问静态成员php,php – 如何访问类的静态成员?
  7. php mkdir 无效,PHP mkdir()无写权限的问题解决方法
  8. Cocos2d-x.3.0开发环境搭建
  9. Oracle数据库中IN参数个数超过1000的问题
  10. 电大c语言程序设计试卷号1075,《C语言程序设计方案》(2012.7)考试试题
  11. 基于ENVI下的土地利用信息提取(三)
  12. matlab 火柴人_小波分析检测信号奇异点matlab代码
  13. Raft一致性算法逻辑详解
  14. NO-SQL(非关系型)数据库性能横向比较
  15. 【李佳辉_周报_2022.10.30】
  16. js实现kmp算法_基于KMP算法JavaScript的实现方法分析
  17. 照片估计明星身高matlab,对比上万张合照,国内男星身高终极论证
  18. STM32芯片VDD、VDDA和VREF的关系
  19. Linux——Ubuntu
  20. CUDA: 程序优化的15个策略

热门文章

  1. 微博安全是一个系统问题包括服务器安全,应用安全开发注意事项
  2. finally语句与return语句的执行顺序
  3. 如何调整反光镜和座椅的位置 为您支招
  4. 音视频即时通讯二次开发
  5. Windows批处理命令学习
  6. windows下使用pthread库
  7. 图像、帧、片、NALU(firstime)
  8. 查看 linux 硬件信息:内存、分区、系统、环境变量、防火墙、路由、端口监听、进程、CPU...
  9. java 接口可以多继承
  10. Postman使用入门