`
konhon
  • 浏览: 1503 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

請大家幫我看看這個設計有沒有什麼問題? 謝謝大家

阅读更多
兩個表(Department部門表, Employee員工表)

Department與Employee是雙向的一對多, 多對一的表(通過DepartmentID關聯)
Department還有上下級部門, 形成樹形關系.
另: 在Department中可以設置部門主管(director), 因此部門的director和Employee的Employeeid也形成了多對一的關系
Employee.java如下
package mis.hr.domain;

import java.io.Serializable;

/**
 * @hibernate.class table="Employee" 
 */
public class Employee implements Serializable {

	private static final long serialVersionUID = 1L;

	private String employeeId;
	private String employeeName;
	private String employeeSex;
	private String email;
	private Department department;

	public Employee() {

	}

	/**
	 * @hibernate.id name="employeeId" generator-class="assigned" length="10" 
	 * @return
	 */
	public String getEmployeeId() {
		return employeeId;
	}

	public void setEmployeeId(String employeeId) {
		this.employeeId = employeeId;
	}

	/**
	 * @hibernate.property name="employeeName"  length="30"
	 * @return String
	 */
	public String getEmployeeName() {
		return employeeName;
	}

	public void setEmployeeName(String employeeName) {
		this.employeeName = employeeName;
	}

	/**
	 * @hibernate.property name="employeeSex"  length="1"
	 * @return String
	 */
	public String getEmployeeSex() {
		return employeeSex;
	}

	public void setEmployeeSex(String employeeSex) {
		this.employeeSex = employeeSex;
	}

	/**
	 * @hibernate.property name="email"  length="100"
	 * @return String
	 */
	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	/**
	 * @hibernate.many-to-one column="departmentId" class="mis.hr.domain.Department"
	 * @return Department
	 */
	public Department getDepartment() {
		return department;
	}

	public void setDepartment(Department department) {
		this.department = department;
	}

}

Employee.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">
<hibernate-mapping>
  <class name="mis.hr.domain.Employee" table="Employee">
    <id name="employeeId" column="employeeId" type="java.lang.String"
      length="10">
      <generator class="assigned">
        <!--  
          To add non XDoclet generator parameters, create a file named 
          hibernate-generator-params-Employee.xml 
          containing the additional parameters and place it in your merge dir. 
        -->
      </generator>
    </id>
    <property name="employeeName" type="java.lang.String" column="employeeName"
      length="30" />
    <property name="employeeSex" type="java.lang.String" column="employeeSex"
      length="1" />
    <property name="email" type="java.lang.String" column="email" length="100" />
    <many-to-one name="department" class="mis.hr.domain.Department"
      cascade="none" outer-join="auto" column="departmentId" />
    <!--
      To add non XDoclet property mappings, create a file named
      hibernate-properties-Employee.xml
      containing the additional properties and place it in your merge dir.
    -->
  </class>
</hibernate-mapping>

Department.java如下
package mis.hr.domain;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

/**
 * @hibernate.class table="Department" 
 */
public class Department implements Serializable {

	private static final long serialVersionUID = 1L;
	private String departmentId;
	private String departmentName;
	private Employee director;
	private Set employees = new HashSet();
	private Department parentDepartment;
	private Set subDepartments = new HashSet();

	public Department() {

	}

	/**
	 * @hibernate.id name="departmentId" generator-class="assigned" length="10"
	 * @return String
	 */
	public String getDepartmentId() {
		return departmentId;
	}

	public void setDepartmentId(String departmentId) {
		this.departmentId = departmentId;
	}

	/**
	 * @hibernate.property name="departmentName" length="30"
	 * @return String
	 */
	public String getDepartmentName() {
		return departmentName;
	}

	public void setDepartmentName(String departmentName) {
		this.departmentName = departmentName;
	}

	/**
	 * @hibernate.many-to-one column="director" class="mis.hr.domain.Employee"
	 * @return Employee
	 */
	public Employee getDirector() {
		return director;
	}

	public void setDirector(Employee director) {
		this.director = director;
	}

	/**
	 * @hibernate.set name="employees" table="Employee"
	 * inverse="true" cascade="save-update" lazy="true"
	 * @hibernate.collection-key column="departmentId"
	 * @hibernate.collection-one-to-many class="mis.hr.domain.Employee"
	 * @return Set
	 */
	public Set getEmployees() {
		return employees;
	}

	public void setEmployees(Set employees) {
		this.employees = employees;
	}

	/**
	 * @hibernate.many-to-one column="parentId" class="mis.hr.domain.Department"
	 * @return Department
	 */
	public Department getParentDepartment() {
		return parentDepartment;
	}

	public void setParentDepartment(Department parentDepartment) {
		this.parentDepartment = parentDepartment;
	}

	/**
	 * @hibernate.set name="subDepartments" table="Department"
	 * inverse="true" cascade="save-update" lazy="true"
	 * @hibernate.collection-key column="parentId"
	 * @hibernate.collection-one-to-many class="mis.hr.domain.Department"
	 *
	 * @return Set 
	 */
	public Set getSubDepartments() {
		return subDepartments;
	}

	public void setSubDepartments(Set subDepartments) {
		this.subDepartments = subDepartments;
	}

}

Department.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">
<hibernate-mapping>
  <class name="mis.hr.domain.Department" table="Department">
    <id name="departmentId" column="departmentId" type="java.lang.String"
      length="10">
      <generator class="assigned">
        <!--  
          To add non XDoclet generator parameters, create a file named 
          hibernate-generator-params-Department.xml 
          containing the additional parameters and place it in your merge dir. 
        -->
      </generator>
    </id>
    <property name="departmentName" type="java.lang.String"
      column="departmentName" length="30" />
    <many-to-one name="director" class="mis.hr.domain.Employee" cascade="none"
      outer-join="auto" column="director" />
    <set name="employees" table="Employee" lazy="true" inverse="true"
      cascade="save-update" sort="unsorted">
      <key column="departmentId"></key>
      <one-to-many class="mis.hr.domain.Employee" />
    </set>
    <many-to-one name="parentDepartment" class="mis.hr.domain.Department"
      cascade="none" outer-join="auto" column="parentId" />
    <set name="subDepartments" table="Department" lazy="true" inverse="true"
      cascade="save-update" sort="unsorted">
      <key column="parentId"></key>
      <one-to-many class="mis.hr.domain.Department" />
    </set>
    <!--
      To add non XDoclet property mappings, create a file named
      hibernate-properties-Department.xml
      containing the additional properties and place it in your merge dir.
    -->
  </class>
</hibernate-mapping>


測試的代碼
		Department department = new Department();
		department.setDepartmentId("01");
		department.setDepartmentName("生產部");

		Department department1 = new Department();
		department1.setDepartmentId("0101");
		department1.setDepartmentName("PMC");

		Employee employee = new Employee();
		employee.setEmployeeId("05-0059");
		employee.setEmployeeName("XXXXX");
		employee.setEmployeeSex("0");
		employee.setEmail("konhon@gmail.com");
		employee.setDepartment(department);
		department.getEmployees().add(employee);
		department.setDirector(employee);

		Employee employee1 = new Employee();
		employee1.setEmployeeId("05-0055");
		employee1.setEmployeeName("XXXXX");
		employee1.setEmployeeSex("0");
		employee1.setDepartment(department1);
		department1.getEmployees().add(employee1);
		department1.setDirector(employee1);

		department1.setParentDepartment(department);
		department.getSubDepartments().add(department1);

		departmentDao.saveDepartment(department);
		departmentDao.saveDepartment(department1);


hibernate產生的SQL語句
[@APPNAME@] DEBUG [main] SQL.log(393) | select department_.departmentId, department_.departmentName as departme2_0_, department_.director as director0_, department_.parentId as parentId0_ from Department department_ where department_.departmentId=?
[@APPNAME@] DEBUG [main] SQL.log(393) | select employee_.employeeId, employee_.employeeName as employee2_1_, employee_.employeeSex as employee3_1_, employee_.email as email1_, employee_.departmentId as departme5_1_ from Employee employee_ where employee_.employeeId=?
[@APPNAME@] DEBUG [main] SQL.log(393) | select department_.departmentId, department_.departmentName as departme2_0_, department_.director as director0_, department_.parentId as parentId0_ from Department department_ where department_.departmentId=?
[@APPNAME@] DEBUG [main] SQL.log(393) | select employee_.employeeId, employee_.employeeName as employee2_1_, employee_.employeeSex as employee3_1_, employee_.email as email1_, employee_.departmentId as departme5_1_ from Employee employee_ where employee_.employeeId=?
[@APPNAME@] DEBUG [main] SQL.log(393) | insert into Department (departmentName, director, parentId, departmentId) values (?, ?, ?, ?)
[@APPNAME@] DEBUG [main] SQL.log(393) | insert into Employee (employeeName, employeeSex, email, departmentId, employeeId) values (?, ?, ?, ?, ?)
[@APPNAME@] DEBUG [main] SQL.log(393) | insert into Department (departmentName, director, parentId, departmentId) values (?, ?, ?, ?)
[@APPNAME@] DEBUG [main] SQL.log(393) | insert into Employee (employeeName, employeeSex, email, departmentId, employeeId) values (?, ?, ?, ?, ?)
[@APPNAME@] DEBUG [main] SQL.log(393) | update Department set departmentName=?, director=?, parentId=? where departmentId=?
[@APPNAME@] DEBUG [main] SQL.log(393) | update Department set departmentName=?, director=?, parentId=? where departmentId=?



我想問:
1. 為什麼insert前還要執行Select查詢, 是不是我的generator-class="assigned"的緣故?
2. 後面的update語句有沒有辦法優化成全部用insert語句完成, 我已經指定了inverse呀. 為什麼不行
分享到:
评论

相关推荐

    关于程序设计的内存分配问题

    不明白内存分配和指针的可以看看,其实这本是我们老师留的一个操作系统科技小论文作业,不知道写什么,干脆把以前收藏的经典C内存分配的文章整理并修改了一下。 此文章有2个用处, 1:这是个小论文,格式完整,大家...

    数据库模型设计.doc

    在正式开始之前,我先向大家介绍两本书——《数据模型资源手册卷一》、《数据模型资源 手册卷二》,国内有机械工业出版社出版的中文译本,很多同行可能都已看过,我本人也 看过。 看过之后深受启发,同时也感到两点...

    唤醒沉睡的计算机教学设计.doc

    在黑板上画出 ,并板书:电源键 师:请坐在左边的同学在笔记本电脑上找到这个电源键,并将右手食指轻轻地放在此 键上,但先不要用力气按下去哦,(指着多媒体机柜)我这还有一台电脑躲在柜子里睡 觉呢,谁来帮我找到...

    重构-改善既有代码的设计

    一直很喜欢重构这本书,但是由于自己记性不太好,书看过之后其中的方法总是记不住,于是想如果有电子版的重构书就好了,工作中遇到重构的问题可以随时打开查阅。在网上搜索了许久,发现重构这本书有英文chm版本的,...

    Asp.NET新闻发布系统(毕业设计版)v1.0

    我平时忙于工作,没什么时间来和大家做长时间的交流,今天抽晚上的时间完成这个系统、、、 现在是早晨的三点,我只做了数据库的显示、和增加,还有.NET 2.0下的GridView的分页显示,希望感 兴趣的朋友,能够下载后...

    2010 SD2.0大会演讲实录.doc

    大会前会有一个问题,到底现场有多少个人已经开了微博的可以举手,我们可以看一下,很多很多,不错,谢谢大家……&gt;&gt;更多 微软Visual Studio商业软件部总经理潘正磊做大会演讲 潘正磊: 我今天想跟大家聊的是云计算...

    [原作]C语言课程设计-停车场管理系统(详看描述)

    问题描述: 汽车在停车场内按车到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车放在车场的最北端),若车场内已停满车辆,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道...

    网上订餐系统-课程设计项目总结及个人总结(特别声明:是项目总结和我个人的原创总结,目录请忽略,望体谅!)

    网上订餐系统课程设计系列文档之-项目总结和个人总结 ...目录是模板里的请忽略,大家取用关键内容就好,谢谢体谅! 目录是模板文件自带的!单看资源名称和我文档对应的多实在啊!跪求大佬别举报了!。。。TAT。。。哭哭

    光盘 琢石成器——Windows环境下32位汇编语言程序设计

    1,不用一上来就说,不是书,妈的,骗我(这个还好了,被骂的多了),我已经说了不是,没注意看吗? 2,连分卷压缩的概念的没,还说怎么解压不了啊?re:有限制大小知道吗? 3,爱下不下,少废话,分数我够了,但是...

    Windows程序设计5版chm 大字版 保证看的舒服

    windows 程序设计的大字版本, 由于原来的windows程序设计看的字体很小,所以费力一把,重新编译成新的chm文件,上传给大家享用,谢谢大家

    7号的数据库课程设计

    这是我们大学的课程设计7号的大家看一下或许有帮助。请给以积分,谢谢

    华为模板设计器

    华为模板设计器,大家使用一下,看看好不好用,谢谢

    vc框架窗口设计,很不错的

    vc框架窗口设计,很不错的一个程序,大家可以下来看看,谢谢啦

    超市管理信息系统(数据库)源代码

    有什么问题也不要直接找我,上 http://www.play78.com/blog 看看吧,肯定有许多你想要的东西,它也有个群,不过不知道满员了没有。最后说说学习VB的方法,对于已经入门的朋友,多看看别人的代码,不管有多烦,总是...

    自己动手写操作系统(含源代码).part2

    爸爸在第二版的最后阶段帮我订正文字,这本书里有你的功劳。我要感谢博文视点的各位朋友,感谢郭老师的理解和支持,感谢李玲的辛勤工作,感谢江立和李冰,你们的高效让我非常钦佩。我还要感谢孟岩老师,你给我的鼓励...

    自己动手写操作系统(含源代码).part1

    爸爸在第二版的最后阶段帮我订正文字,这本书里有你的功劳。我要感谢博文视点的各位朋友,感谢郭老师的理解和支持,感谢李玲的辛勤工作,感谢江立和李冰,你们的高效让我非常钦佩。我还要感谢孟岩老师,你给我的鼓励...

    数据库课程设计体育管理系统

    本人做的数据库课程设计,这是目录后面还有正文, 代码,前言,图。 大家可以看看,参考! 谢谢挺!

Global site tag (gtag.js) - Google Analytics