부자류표의 디자인

설명: 한 부서에 몇 개의 하위 부서가 있고 하위 부서에 하위 부서가 있을 수 있다. 본고는 myeclipse가 이런 트리 관계의 지속화를 어떻게 실현하는지 보여준다.
개발 도구: myeclipse 5.5.1 GA
데이터베이스:mysql-5.0.37
운영 체제: 윈도우즈 xp professional 중국어 버전
단계:
1. mysql5 데이터베이스 테스트db를 구축하고 스크립트 아래에 제시합니다.
2. myeclipse의 데이터베이스 서버를 설정하고 mysql5라는 데이터베이스 링크를 만듭니다.
3、myeclipse의 웹 프로젝트를 제안합니다. 이름은 dx 입니다.d2yzs,hibernate 지원에 가입하고hibernate3을 선택하십시오.1, 최고 3.1까지 지원.
4. myeclipse의 데이터베이스 보기에서 데이터베이스를 연결하고 표를 통해 실체 PO와 프로필을 생성하며 중간에DAO를 생성하지 않습니다.
5. 프로필의 정확성을 검사한 다음에 테스트 클래스에서 테스트를 진행한다.
1. 데이터베이스를 만드는 스크립트:  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 데이터베이스 서버의 파라미터를 설정해야 합니다.데이터베이스의 엔진은 이노DB를 사용해야 하며 자동 제출 모드, 즉 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

  ------------------------------------
2. 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();
  }   
  }
  }

4. 테스트 클래스 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는 아무런 변경도 필요 없고, 생성된 마핑도 카스캐드="save-update"를 추가해야 한다.그리고 테스트 클래스를 직접 써서 테스트를 진행합니다.

좋은 웹페이지 즐겨찾기