兩個表(Department部門表, Employee員工表)
Department與Employee是雙向的一對多, 多對一的表(通過DepartmentID關聯)
Department還有上下級部門, 形成樹形關系.
另: 在Department中可以設置部門主管(director), 因此部門的director和Employee的Employeeid也形成了多對一的關系
Employee.java如下
Employee.hbm.xml如下
Department.java如下
Department.hbm.xml如下
測試的代碼
hibernate產生的SQL語句
我想問:
1. 為什麼insert前還要執行Select查詢, 是不是我的generator-class="assigned"的緣故?
2. 後面的update語句有沒有辦法優化成全部用insert語句完成, 我已經指定了inverse呀. 為什麼不行
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:这是个小论文,格式完整,大家...
在正式开始之前,我先向大家介绍两本书——《数据模型资源手册卷一》、《数据模型资源 手册卷二》,国内有机械工业出版社出版的中文译本,很多同行可能都已看过,我本人也 看过。 看过之后深受启发,同时也感到两点...
在黑板上画出 ,并板书:电源键 师:请坐在左边的同学在笔记本电脑上找到这个电源键,并将右手食指轻轻地放在此 键上,但先不要用力气按下去哦,(指着多媒体机柜)我这还有一台电脑躲在柜子里睡 觉呢,谁来帮我找到...
一直很喜欢重构这本书,但是由于自己记性不太好,书看过之后其中的方法总是记不住,于是想如果有电子版的重构书就好了,工作中遇到重构的问题可以随时打开查阅。在网上搜索了许久,发现重构这本书有英文chm版本的,...
我平时忙于工作,没什么时间来和大家做长时间的交流,今天抽晚上的时间完成这个系统、、、 现在是早晨的三点,我只做了数据库的显示、和增加,还有.NET 2.0下的GridView的分页显示,希望感 兴趣的朋友,能够下载后...
大会前会有一个问题,到底现场有多少个人已经开了微博的可以举手,我们可以看一下,很多很多,不错,谢谢大家……>>更多 微软Visual Studio商业软件部总经理潘正磊做大会演讲 潘正磊: 我今天想跟大家聊的是云计算...
问题描述: 汽车在停车场内按车到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车放在车场的最北端),若车场内已停满车辆,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道...
网上订餐系统课程设计系列文档之-项目总结和个人总结 ...目录是模板里的请忽略,大家取用关键内容就好,谢谢体谅! 目录是模板文件自带的!单看资源名称和我文档对应的多实在啊!跪求大佬别举报了!。。。TAT。。。哭哭
1,不用一上来就说,不是书,妈的,骗我(这个还好了,被骂的多了),我已经说了不是,没注意看吗? 2,连分卷压缩的概念的没,还说怎么解压不了啊?re:有限制大小知道吗? 3,爱下不下,少废话,分数我够了,但是...
windows 程序设计的大字版本, 由于原来的windows程序设计看的字体很小,所以费力一把,重新编译成新的chm文件,上传给大家享用,谢谢大家
这是我们大学的课程设计7号的大家看一下或许有帮助。请给以积分,谢谢
华为模板设计器,大家使用一下,看看好不好用,谢谢
vc框架窗口设计,很不错的一个程序,大家可以下来看看,谢谢啦
有什么问题也不要直接找我,上 http://www.play78.com/blog 看看吧,肯定有许多你想要的东西,它也有个群,不过不知道满员了没有。最后说说学习VB的方法,对于已经入门的朋友,多看看别人的代码,不管有多烦,总是...
爸爸在第二版的最后阶段帮我订正文字,这本书里有你的功劳。我要感谢博文视点的各位朋友,感谢郭老师的理解和支持,感谢李玲的辛勤工作,感谢江立和李冰,你们的高效让我非常钦佩。我还要感谢孟岩老师,你给我的鼓励...
爸爸在第二版的最后阶段帮我订正文字,这本书里有你的功劳。我要感谢博文视点的各位朋友,感谢郭老师的理解和支持,感谢李玲的辛勤工作,感谢江立和李冰,你们的高效让我非常钦佩。我还要感谢孟岩老师,你给我的鼓励...
本人做的数据库课程设计,这是目录后面还有正文, 代码,前言,图。 大家可以看看,参考! 谢谢挺!