`

父子类表的设计

阅读更多

说明:一个部门有若干个子部门,子部门还可以有子部门,本文通过这个演示myeclipse如何实现这种树形关系的持久化。

  开发工具:myeclipse 5.5.1 GA

  数 据 库:mysql-5.0.37

  操作系统:windows xp professional 中文版

  步骤:

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

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

  3、建议myeclipse的web工程,名称为dx_d2yzs,并加入hibernate支持,选择hibernate3.1,最高就支持到3.1。

  4、在myeclipse的数据库视图中链接数据库并通过表生成实体PO和配置文件,中间不生成DAO。

  5、检查配置文件的正确性,然后测试类进行测试。

  一、建立数据库的脚本:

  drop table if exists part;
  -- alter table part drop foreign key fk_part;
  create table part(
  id bigint not null primary key,
  name varchar(20),
  father_id bigint
  );
  alter table part add index fk_part (father_id),
  add constraint fk_part foreign key (father_id) references part(id);

  表关系的逻辑图:

  +-----------+
  | Part   |
  +-----------+
  | id    |<---------|<PK>
  | name   |     |
  | father_id |----------|<FK>
  +-----------+

  特别注意:因为有外键约束,需要事务支持,在安装数据库的时候,需要配置mysql数据库服务器的参数。数据库的引擎应该用InnoDB,关闭了自动提交模式,也就是SET AUTOCOMMIT=0。

 

 

 

  #[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生成实体和配置文件:

  Part.java
  ---------------------
  public class Part implements java.io.Serializable {
  // Fields
  private Long id;
  private String name;
  private Part part; //父Part
  private Set parts = new HashSet(0); //字Part
  // Constructors
  /** default constructor */
  public Part() {
  }
  /** minimal constructor */
  public Part(Long id) {
  this.id = id;
  }
  public Part(String name) {
  this.name = name;
  } 
  /** full constructor */
  public Part(Long id, Part part, String name, Set parts) {
  this.id = id;
  this.part = part;
  this.name = name;
  this.parts = parts;
  }
  // Property accessors
  public Long getId() {
  return this.id;
  }
  public void setId(Long id) {
  this.id = id;
  }
  public Part getPart() {
  return this.part;
  }
  public void setPart(Part part) {
  this.part = part;
  }
  public String getName() {
  return this.name;
  }
  public void setName(String name) {
  this.name = name;
  }
  public Set getParts() {
  return this.parts;
  }
  public void setParts(Set parts) {
  this.parts = parts;
  }
  }
  Part.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.Part" table="part">
  <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="20" />
  </property>
  <many-to-one name="part" class="org.lavasoft.Part" fetch="select">
  <column name="father_id" />
  </many-to-one>
  <set name="parts" cascade="save-update" inverse="true">
  <key>
  <column name="father_id" />
  </key>
  <one-to-many class="org.lavasoft.Part" />
  </set>
  </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");
  Part p1=new Part("p1");
  Part p11=new Part("p11");
  Part p12=new Part("p12");
  p1.getParts().add(p11);
  p1.getParts().add(p12);
  p11.setPart(p1);
  p12.setPart(p1);
  Session session = HibernateSessionFactory.getSession();
  Transaction tx=session.beginTransaction();
  try {
  session.save(p1);
  tx.commit();
  } catch (HibernateException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  tx.rollback();
  }finally{
  session.close();
  }   
  }
  }

  四、运行测试类Test,控制台打印信息:

  ------------------------------------------
  Hibernate: select max(id) from part
  Hibernate: insert into part (name, father_id, id) values (?, ?, ?)
  Hibernate: insert into part (name, father_id, id) values (?, ?, ?)
  Hibernate: insert into part (name, father_id, id) values (?, ?, ?)
  查看数据库:
  ------------------------------------------
  D:mysql-5.0.37-win32bin>mysql -uroot -pleizhimin
  Welcome to the MySQL monitor. Commands end with ; or g.
  Your MySQL connection id is 13
  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      |
  | part       |
  | person      |
  | t_user      |
  | user       |
  +------------------+
  7 rows in set (0.02 sec)
  mysql> describe part;
  +-----------+-------------+------+-----+---------+-------+
  | Field   | Type    | Null | Key | Default | Extra |
  +-----------+-------------+------+-----+---------+-------+
  | id    | bigint(20) | NO  | PRI |     |    |
  | name   | varchar(20) | YES |   | NULL  |    |
  | father_id | bigint(20) | YES | MUL | NULL  |    |
  +-----------+-------------+------+-----+---------+-------+
  3 rows in set (0.00 sec)
  mysql> select * from part;
  +----+------+-----------+
  | id | name | father_id |
  +----+------+-----------+
  | 1 | p1  |   NULL |
  | 2 | p12 |     1 |
  | 3 | p11 |     1 |
  +----+------+-----------+
  3 rows in set (0.00 sec)
  mysql>

 

  测试结果表明,保存父机关的时候,可以级联保存父机关下的子机关。

  总结:这个表建立好后,由myeclipse生成的PO不需要做任何改动,生成的mapping也需要添加一个cascade="save-update"。然后就直接写测试类进行测试。

分享到:
评论

相关推荐

    父子类接口实验

    父子类借口设计简单

    java三大特性说明

     在代码的类之间关系的设计阶段,理论上要求父子类之间没有相同的同名方法.但语法允许子类重写父类的方法.要求子类当中只有自己特有的方法和属性,其他部分与父类和其他同级子类相同的部分都从父类继承得来.  有关...

    Java设计模式-装饰者模式

    从这个模式的名字“装饰者”可以看出,这个设计模式是基于已有的类进行设计的一种模式。 装饰者模式他是为了让已经存在的类的功能更多,更全面。 装饰者模式怎么用 首先我们先放入我们的测试类,测试类中的类便是用...

    仓库管理系统设计与实现.pdf

    父子窗体结构的使用,简洁明了,使用方便,研制的仓库管理系统应该能够为仓库管理人员提供充足的信息。快捷的数据处理手段,非常好的功能扩展模型,提高了基于仓库入库出库管理的工作效率,节约了仓库的时间。本系统...

    流程图与类C语言实时转换方法

    为了融合图形化和文本语言2种编程方式的优点,提高教育机器人编程平台的直观性和通用性,结合编程平台要求,设计出流程图与类C语言双向实时转换方法.在进行流程图到类C语言转换时,实时根据各个模块间的父子关系遍历模块...

    设计应用程序图形与文本界面

    掌握以下几类控件的使用方法: 菜单的执行----响应事件、复选框、对话框 工具栏和状态栏 动作列表 父子窗口的设计 多页面界面

    java设计模式

    目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式

    OpenSceneGraph三维渲染引擎设计与实践

    4.1.2 节点的父子关系 58 4.1.3 叶节点与组节点 59 4.1.4 节点的功能与分类 62 4.2 节点的访问 65 4.2.1 访问器机制 65 4.2.2 节点的遍历函数 67 4.2.3 范例:节点属性访问器 68 4.2.4 节点的更新与事件回调 ...

    parentAndSon.rar

    使用IDEA创建maven父子工程项目(SpringBoot+SpringCloud为例Zuul,Eureka)使用IDEA创建maven父子工程项目(SpringBoot+SpringCloud为例Zuul,Eureka)使用IDEA创建maven父子工程项目(SpringBoot+SpringCloud为例...

    最新PRO.ENGINEER中文野火版4.0技术入门与案例应用.pdf

    7.2.3 特征之间的父子关系 选取草绘平面 几何图元对齐 特征复制操作 7.2.4 修改特征 7.2.5 重定义特征 7.2.6 隐含、恢复和删除特征 隐含特征 恢复特征 删除特征 7.2.7 缩放模型 7.2.8 其他特征操作 7.2.9 特征组 ...

    [C大学教程(第五版)].(美)戴特尔.扫描版.pdf

    Deitel父子再次设定了优秀教材的标准!不但透彻、仔细地向学生讲解编程语言,而且更加注重思想、概念以及程序设计技术。新加八的“活代码”方法也是一大新增特色,促进学生积极地参与到程序设计中来。这是一本非常...

    Delphi深度编程技术

    15.2 权限设计表中数据的维护 第16章 通用查询和报表组件的制作 16.1 通用查询组件的创建 16.2 通用报表模块的制作 第17章 通用基础数据维护模块的设计 17.1 界面设计 17.2 代码实现 17.2.1 以目录树的...

    php无限级评论嵌套实现代码

    我在设计BB的过程中,也一直在思考是否可以不通过递归来实现无限级分类的结构展现和父子结构查找,因为如果不对这里的算法进行优化后果可能是致命的!试想一下,一篇文章如果评论数为300,按正常的递归算法,至少就...

    流程图与类C语言实时转换方法 (2009年)

    为了融合图形化和文本语言2种编程方式的优点,提高教育机器人编程平台的直观性和通用性,结合编程平台要求,设计出流程图与类C语言双向实时转换方法。在进行流程图到类C语言转换时,实时根据各个模块间的父子关系...

    《Delphi 深度编程及其项目应用开发》PDF书及代码

    13.1.1 系统流程 13.1.2 系统功能 13.2 构建客户端应用程序框架 第14章 动态连接应用服务器的实现 第15章 通用权限管理模块的设计 15.1 系统登录的设计 15.2 权限设计表中数据的维护 第16章 通用查询和报表组件的...

    asp.net知识库

    使用Relations建立表之间的关系并却使用PagedDataSource类对DataList进行分页 通过作业,定时同步两个数据库 SQLSERVER高级注入技巧 利用反射实现ASP.NET控件和数据实体之间的双向绑定,并且在客户端自动验证输入的...

    web:springboot 创建父子工程、聚合工程

    :wyait-common(统一保存通用工具类)wyait-web工程【子】:wyait-web(聚合工程)项目框架简述wyait-web 项目框架设计简述:wyait-web-pojo:保存pojo和entity实体类;wyait-web-dao:数据访问层,与底层 MySQL...

    21天学通Java-由浅入深

    202 10.3.3 父子类间的构造器的调用流程 204 10.3.4 如何自定义构造器 207 10.4 什么是单子模式 208 10.5 构造器在程序中是何时运行的 211 10.6 综合练习 214 10.7 小结 215 10.8 习题 215 第11章 异常处理(精彩...

    jeecg-framework-v2.0 (最新源码)

    开发效率很高,单表数据模型和一对多(父子表)数据模型,增删改查功能自动生成,菜单配置直接使用; 3.页面校验自动生成(必须输入、数字校验、金额校验、时间空间等); 4.封装完善的用户权限功能,直接使用 5.常用共通...

    JEECG-FRAMEWORK

    2.开发效率很高,单表数据模型和一对多(父子表)数据模型,增删改查功能自动生成,菜单配置直接使用; 3.页面校验自动生成(必须输入、数字校验、金额校验、时间空间等); 4.封装完善的用户权限和数据字典等基础功能,...

Global site tag (gtag.js) - Google Analytics