`

父子类表的设计

阅读更多

说明:一个部门有若干个子部门,子部门还可以有子部门,本文通过这个演示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"。然后就直接写测试类进行测试。

分享到:
评论

相关推荐

    完美解决bootstraptable父子表子表渲染问题

    "完美解决bootstraptable父子表子表渲染问题"的标题表明我们将探讨如何处理子表无法正确渲染或调用初始化方法的常见问题。 首先,让我们理解父子表的基本概念。在BootstrapTable中,父子表通常通过点击父表格的某一...

    BIEE父子维度设计

    【BIEE父子维度设计】是指在Oracle Business Intelligence Enterprise Edition (BIEE) 11.6版本中,如何构建并管理具有父子关系的多级层次结构的维度。这种设计通常用于表示组织结构、地理位置或其他有层级关系的...

    父子类接口实验

    在Java编程中,"父子类接口实验"涉及到的核心概念是面向对象设计中的继承、多态性、抽象类以及接口的使用。下面我们将详细探讨这些知识点。 1. **继承(extends)**:继承是面向对象的一个重要特性,允许一个类...

    MDI父子窗体的设计

    MDI(Multiple Document Interface)是Windows应用程序中的一种设计模式,允许在一个父窗口内同时打开多个子窗口,每个子窗口可以独立显示和操作不同的文档。在C#编程中,MDI父窗体和子窗体的设计是一项重要的技能,...

    接口,父子类的转换关系

    在编程领域,接口和父子类的转换关系是面向对象编程中的核心概念,它们在软件设计中扮演着至关重要的角色。接口定义了一组方法签名,而父类(也称为基类)提供子类可以继承的属性和行为。让我们深入探讨这两个概念...

    JasperReports数据库查询父子报表模板

    一旦模板和数据源准备就绪,可以通过Java API调用`JasperFillManager`和`JasperPrint`类来填充数据并生成报表。生成的报表可以以多种格式导出,如PDF、HTML、Excel等。 7. **源码与工具** 标签中的"源码"和"工具...

    父子节点获取

    3. **工具类设计**:可以创建一个`TreeUtil`工具类,提供静态方法如`buildTree(List&lt;Node&gt; nodes)`,该方法接收一个包含所有节点的列表,然后按照上述逻辑构造出树形结构。 4. **实现类**:如果需要更复杂的功能,...

    c#父子窗口的应用程序源代码

    在IT领域,尤其是在Windows应用程序开发中,"父子窗口"是一个常见的设计模式,它涉及到一个主窗口(父窗口)与一个或多个子窗口之间的交互。在C#编程语言中,我们可以利用Windows Forms或WPF(Windows Presentation ...

    C#实现父子窗体全传值案例

    - 设计良好的API接口,使代码易于理解和维护。 总之,"C#实现父子窗体全传值案例"涵盖了窗口交互、模态对话框使用以及数据传递等多个关键点,这些都是在开发C#桌面应用程序时不可或缺的知识。通过深入理解并实践...

    组合框 父子对话框 操作

    2. **设计对话框资源**:使用Visual Studio的资源编辑器创建对话框资源,放置组合框和其他控件。 3. **初始化组合框**:在父对话框的 OnInitDialog() 函数中填充组合框的选项,可以通过AddString或InsertString方法...

    父子窗体的调用 c#

    在C#编程中,"父子窗体的调用"是一个常见的功能需求,特别是在开发桌面应用程序时,例如Windows Forms或WPF应用。这个概念涉及到一个窗口(父窗体)如何启动、控制和通信与另一个窗口(子窗体)。下面将详细阐述这一...

    使用DataGridView控件实现主从表

    在数据库设计中,主从表(也称为父子表或一对多关系)用于表示两个表之间的关系,其中一个表(主表)有一条记录对应多个记录在另一个表(从表)中。例如,一个员工表(主表)可能包含多个项目表(从表),每个员工...

    Reporting Service 父子下拉树型菜单,父子下钻

    在这个特定的场景中,我们讨论的是如何实现"父子下拉树型菜单"和"父子下钻"的功能,这在数据可视化和交互式报表设计中非常常见。这种功能允许用户通过层级结构查看和探索数据,为复杂的业务分析提供了直观且高效的...

    简单的java类的重写还有父子类的练习(多种图形面积求取)

    在Java编程语言中,类的继承和...这种设计模式使得代码结构清晰,易于扩展,当需要添加新的图形类型时,只需创建一个新的子类并实现相应的面积和周长计算方法即可。这正是面向对象编程的核心思想:封装、继承和多态。

    sql_函数实现三种父子递归

    这样的表设计适用于表示具有层级关系的数据,例如地理区域或组织结构。 1. 找到所有子节点(正向递归): 在这个场景中,我们从一个特定的节点开始,查找其所有直接和间接的子节点。这可以通过自定义函数实现,如`...

    WPF父子窗体传输示例

    此外,WPF提供了更高级的数据绑定和MVVM(Model-View-ViewModel)设计模式,可以更优雅地处理父子窗体间的数据交互。例如,父窗体和子窗体可以共享同一个ViewModel,通过ObservableCollection或DependencyProperty...

    父子窗体完美解決

    在软件开发过程中,尤其是涉及到图形用户界面(GUI)的应用程序设计时,父子窗体的概念是十分常见的。父子窗体关系是指一个窗体(父窗体)可以打开另一个窗体(子窗体),并且子窗体通常会在父窗体的内部或外部显示...

    C#实现父子窗体嵌套.zip

    在C#编程中,父子窗体的嵌套是一种常见的用户界面设计模式,它允许一个窗体(父窗体)打开另一个窗体(子窗体),并控制子窗体的显示和关闭。这样的设计有助于创建更复杂的多窗口应用程序,提供更好的用户体验。在...

    pyqt父子窗口相互传值

    在PyQt5编程中,父子窗口间的通信是一个常见的需求,特别是在设计多窗口应用程序时。"pyqt父子窗口相互传值"这个主题就是关于如何在不同的QMainWindow或QWidget实例之间传递数据。下面将详细讲解这个过程,并提供一...

    nicklee的demo(针对父子列表清单)

    【压缩包子文件的文件名称列表】只有一个文件名"Nicklee",这可能是一个包含所有源代码、样式表、脚本或其他必要资源的主文件夹。通常,这样的压缩包会包含至少一个HTML文件(用于展示界面)、CSS文件(定义样式)和...

Global site tag (gtag.js) - Google Analytics