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

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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467047.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python的程序结构[4] - 函数/Function[2] - 匿名函数

匿名函数 / Anonymous Function 匿名函数是一种不需要绑定函数名的函数 (i.e. functions that are not bound to a name)。匿名函数通过 lambda 表达式进行构建。常用于快速建立起一个(一次性的)函数。 Note: lambda 是 Python 的一个表达式/关键字&#xff0c;类似 return&…

数组 的地址计算

数组是一个特殊的数据结构&#xff0c;数组的基本操作不涉及数组结构的变化&#xff0c;因此对于数组而言&#xff0c;采用顺序存储表示比较合适。数组的顺序存储结构有两种&#xff1a;一、以行序存储&#xff0c;如高级语言BASIC、COBOL、Pascal、c语言。二、以列序存储&…

你会选择深圳还是佛山?

最近是校招季节&#xff0c;有很多人在询问offer的问题&#xff0c;我知道我已经发了很多这样相关的文章&#xff0c;可能大家看着都有点不耐烦了&#xff0c;不过还是想说&#xff0c;人生重要的选择真的没有几个&#xff0c;我每次回答都特别慎重&#xff0c;我有时候发出来也…

盗版XP变正版

此帖为转贴&#xff01;经本人测试100&#xff05;成功&#xff0c;谨以此帖献给各位目前不能更新的猫们&#xff0c;免得四处搜寻&#xff0c;徒劳无功&#xff01;一、经过无数次验证&#xff0c;本方法绝对有效&#xff01;敬请一试&#xff01;&#xff01;1。点击开始栏→…

区间K大数查询

给定一个序列&#xff0c;每次询问序列中第l个数到第r个数中第K大的数是哪个。输入格式第一行包含一个数n&#xff0c;表示序列长度。第二行包含n个正整数&#xff0c;表示给定的序列。第三个包含一个正整数m&#xff0c;表示询问个数。接下来m行&#xff0c;每行三个数l,r,K&a…

optimizer

在很多机器学习和深度学习的应用中&#xff0c;我们发现用的最多的优化器是 Adam&#xff0c;为什么呢&#xff1f; 下面是 TensorFlow 中的优化器&#xff0c; https://www.tensorflow.org/api_guides/python/train 在 keras 中也有 SGD&#xff0c;RMSprop&#xff0c;Adagr…

【漫画】25岁程序员 VS 35岁程序员,塑造自己的不可替代性,才能让自己更有价值 ​...

其中的酸甜苦辣你中了几条经常有人说&#xff1a;35岁是程序员的魔咒。但其实相比于刚毕业的年轻人&#xff0c;虽然35岁的程序员从精力上和年龄上都不再占有优势&#xff0c;但十几年的沉淀所造就的从容也是这个年龄段所独有的。当然&#xff0c;也不只是程序员&#xff0c;任…

C语言——内存管理

C语言——内存管理 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 //变量的存储布局&#xff08;伴随初级程序员和高级工程师一生的&#xff09; 静态区&#xff1a;全局变量和static变量&#xff0c;初始化的全局变量和静态变量放在一块区域&#xf…

WIN命令

azman.msc--授权管理器admgmt.msc--ad管理calc-----------启动计算器certmgr.msc--证书&#xff0d;当前用户certtmpl.msc--证书模板 compmgmt.msc---计算机管理conf-------启动netmeetingcys--配置您的服务器dcomcnfg.exe--组件服务dcpol.msc--域控制器策略 filesvr.msc--文件…

拦截导弹

拦截导弹 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;3描述某国为了防御敌国的导弹袭击&#xff0c;发展中一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷&#xff1a;虽然它的第一发炮弹能够到达任意的高度&#xff0c;但是以后每一发…

C标准库

嘤嘤嘤&#xff0c;C标准库&#xff0c;我来了转载于:https://www.cnblogs.com/Fsiswo/p/8116331.html

你确定你会使用git commit?

我记得刚工作的时候&#xff0c;我第一次写git commit的内容&#xff0c;直接上来就是一个git commit -m "加上自己的注释"&#xff0c;就这样提交了。后来&#xff0c;我去了中兴&#xff0c;又去了恒大&#xff0c;接触到很多人做项目&#xff0c;发现做项目的时候…

adb devices unauthorized解决方法

有时候使用adb连接手机时&#xff0c;即使打开了usb调试&#xff0c;手机添加了信任&#xff0c;仍然出现unauthorized的提示 解决办法如下&#xff1a; 先上两张stack overflow上面的图片&#xff1a; 很多人可能看不懂。翻一下大概如下&#xff1a; 也就是在 C:\Users\xxx\.a…

可怕,别人把我MCU固件给反汇编了!

相关文章很多人都不清楚HEX文件格式CPU怎么认识代码的&#xff1f;一个超强的逆向分析软件本文主要跟大家分享一个简单逆向stm32固件程序的实例&#xff0c;为了让大家在一款成熟的产品中去考虑加密这一块的技术&#xff0c;不然分分钟被别人copy&#xff01;2、情景再现咬金&a…

GridView相关问题汇总

<asp:gridview id"gvData" runat"server" autogeneratecolumns"False"> <columns> <asp:templatefield headertext"所属系统"> <itemtemplate> <asp:label id…

带参数的宏定义

不是进行简单的字符串替换&#xff0c;还要进行参数替换。其定义的一般形式为#define 宏名(参数表) 字符串字符串中包含在括弧中所指定的参数。如&#xff1a;#define S(a,b) a*bareaS(3,2);定义矩形面积S&#xff0c;a 和 b 是边长。在程序中用了S(3,2)&#xff0c;把3、2分别…

数据结构——堆栈

数据结构——堆栈 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1、特性&#xff1a;先进后出&#xff08;FILO&#xff09; 2、应用&#xff1a; 子程序的调用 处理递归调用 表达式转换与求值 二叉树的遍历 图形的深度优化优先 3、用数组仿真堆栈 &a…

处理String类常用的方法1

public class Dome{public static void main(String[] args) {char[] chnew char[] {你,你,你};String strnew String(ch);System.out.println(str);char[] qwestr.toCharArray();} }此为数组转化为字符串&#xff0c;然后字符串又转回数组的方法。 public static void main(St…

电脑控制android手机神器,scrcpy

我同事有一个华为手机&#xff0c;手机里内置了NFC&#xff0c;然后把手机靠近下电脑&#xff0c;当然的&#xff0c;一定需要是华为笔记本&#xff0c;然后电脑就弹出一个界面&#xff0c;控制手机的界面&#xff0c;这个功能非常好&#xff0c;加上NFC的功能&#xff0c;体验…

粗谈LINUX下的文件系统管理

在各网络操作系统中,都可分为系统理与网络管理两部分&#xff0c;而在LINUX下&#xff0c;若要向系统管理方面发展的话&#xff0c;就必须了解LINUX下的用户管理与文件管理。前面己经介绍了用户管理&#xff0c;下面将粗谈一下LINUX下的文件系统。那么究竟什么是文件系统呢&…