`
jknmae
  • 浏览: 10924 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
收藏列表
标题 标签 来源
Hibernate 高级映射分类(2) hibernate 映射分类 一对多 多对多
1.2 一对多 即两个表通过外键进行关联,一个部门,多个员工;一个学校,多个学生;这里的两个表通过外键关联

  public class Department {
	private int deptid;
	private String dname;
	private String location;
	private Set<Employee> employees=new HashSet<Employee>(); //这里是一个集合 一个部门有多个 员工 即"多"
  }

  public class Employee {
	private int empid;
	private String ename;
	private Department department;  //而对每个员工来说只有一个部门 即 "一"
  }

我们先按我们的思路想下配置文件  有一个Department对应{Employee..}也就是many 个Employee 对应一个
Department 并且有many个外键
<hibernate-mapping 
	package="com.bjsxt.po">
	<class name="Employee" table="t_employee" >
		<id name="empid">
			<generator class="native"></generator>
		</id>
		<property name="ename"></property>
		<many-to-one name="department" class="Department" cascade="all" >
			<column name="dept_id"></column>  <!-- 这个就是我们前面说到的多个外键--!>
		</many-to-one>
	</class>
</hibernate-mapping>
而Department类中不是有一个set 的集合吗 所以用到set  

<hibernate-mapping package="com.bjsxt.po">
	<class name="Department" table="t_department" >
		<id name="deptid">
			<generator class="native"></generator>
		</id>
		<property name="dname"></property>
		<property name="location"></property>
		<set name="employees" cascade="save-update" inverse="false" >
			<key>
				<column name="dept_id"></column> <!-- 对应employee中的一个列 --!>			
			</key>
			<one-to-many class="Employee" />
		</set>
	</class>
</hibernate-mapping>
 其中cascade  属性和inverse 属性比较重要
 cascade 属性是级联的操作,比如我们增加一个员工时同时对该员工的部门设置了值.如果数据库中没有记录.则
 强大的Hibernate 会为我们创建表,并添加记录并建立关系。当然这些只是我们上面配置的文件的作用.
  cascase = all  进行任何操作时都级联
            save-update 保存和更新时
            delete 删除时级联
           all-delete-orpnan 当被关联对象失去宿主时,将其删除 也就是如果我们把部门删除了,那么员工自然就没有家可回了,会被一并删除  特别注意如果此属性不设置,则会报错
inverse 属性 =false =true  表示由哪一方维护外键的值 false是双方都可以维护,true是有多方维护 .true效率高
最后,终于要说多对多的情况了 首先我们应该知道,多对多就会产生中间表,而中间表肯定有两个表的字段
1.n
   public class Student2 {
	private int id;
	private String name;
	private Set courses=new HashSet();  //这里是一个set的集合了, 学生可以有多门课程
   }

   public class Course {
	private Long id;
	private String name;
	private Set students =new HashSet(); //课程也可以被多个同学选修
   }

   这里我们假设没有hibernate 帮我们的情况下,我们应该自己建立一个中间表 student_course
表中自然有student_id,course_id 如果我们这样想的话。那么配置文件一看就明白

 <hibernate-mapping package="com.bjsxt.po">
	<class name="Student2" table="t_student2" lazy="true">
		<id name="id">
			<generator class="native"></generator>
		</id>
		<property name="name"/>
                   <!-- set 出现了,表为stu_course 即为中间表--!>
		<set name="courses" table="stu_course" cascade="save-update">
			<key column="stuId" />		 <!-- key 对应当前表的外键  --!>
			<many-to-many class="Course" column="courseId" />
		</set>
	</class>
 </hibernate-mapping>
此时我们应该猜想Course.hbm.xml应该和这个一样,只是一些小小的差别
<hibernate-mapping package="com.bjsxt.po">
	<class name="Course" table="t_course" lazy="true">
		<id name="id">
			<generator class="native"></generator>
		</id>
		<property name="name"/>
		<set name="students" table="stu_course" cascade="save-update">
			<key column="courseId" />		//t_sourse的外键
			<many-to-many class="Student2" column="stuId" />
		</set>
	</class>
</hibernate-mapping>

基础上一些大的我们已经配置完了。当然这些都可以在网上查到。但最少我们应该知道怎么配。



Hibernate 高级映射分类(1) hibernate, 映射分类, 一对多,多对多 #
Hibernate  的映射
 一、实体映射
	1.基本映射技术(类与表的映射,主键映射,普通字段映射) 类映射
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.bjsxt.po">
	<class name="Address2" table="t_address2">
		<id name="id">
			<generator class="native"></generator>
		</id>
		<property name="city"/>
		<property name="country"/>
	</class>	
</hibernate-mapping>
二、联合主键映射
<hibernate-mapping 
	package="com.bjsxt.po">
	<class name="Student" table="t_student" lazy="true" >
		<composite-id name="id" class="StudentId">
			<key-property name="firstname" type="string" column="firstname"/>
			<key-property name="lastname"/>
		</composite-id>		
		<property name="major"/>
	</class>
</hibernate-mapping>
三、组合关系映射 (一个类和中有另一个类的引用,并将两个类组合成为一个表)

<hibernate-mapping 
	package="com.bjsxt.po">
	<class name="Person" table="t_person" >
		<id name="id">
			<generator class="native"></generator>
		</id>
		<component name="address" class="Address"> <!-- 这里的address是另外一个类 
                          Pserson类持有Address类的引用--!>
			<property name="city"></property>
			<property name="street"></property>
			<property name="zipcode"></property>
		</component>
		<property name="name"></property>
	</class>
</hibernate-mapping>
四、大对象映射
     所谓的大对象其实不过是数据库中的一种类型,可以将视频或者 图片存入到数据库中。
     使用是若用mysql要注意添加一个转码.同时调整mysql中的Blob 为longBlob
     jdbc:mysql://localhost:3306/hib?useUnicode=true&characterEncoding=utf-8
五、关联映射
   1.一对一映射
     1.1唯一外键关连
public class Company {
	
	private int id;
	private String name;
	private Address2 address2;   持有外键的对象
        //get set 方法
}
public class Address2 {
	private int id;
	private String city;
	private String country;
	private Company company;
}
<hibernate-mapping package="com.bjsxt.po">
	<class name="Company" table="t_company">
		<id name="id">
			<generator class="native"></generator>
		</id>
		<property name="name"/>
		<many-to-one name="address2" class="Address2"
                    unique="true" 
                 cascade="all" >
                 <column name="addressId"/>
                </many-to-one>
	</class>	
</hibernate-mapping>
<hibernate-mapping package="com.bjsxt.po">
	<class name="Address2" table="t_address2">
		<id name="id">
			<generator class="native"></generator>
		</id>
		<property name="city"/>
		<property name="country"/>
		<one-to-one name="company" class="Company"  
       property-ref="address2"     cascade="save-update">  //此property-ref指的是外键,也就是从address2中找外键 
               </one-to-one>
	</class>	
</hibernate-mapping>
     1.2主键关联和唯一关联几乎一样 ,唯一的关别在于 将many-to-one 改成one-to-one 删除property-ref 和unique

  




JAVA WEB中带条件查询的分页
对于带条件查询的分页,用到的主要是session,在提交时判断是不是第一次提交,如果是session.getAttribute("condition") ==null 则为空,同时创建一个新的这里我们用Map 存放健值对,并将此对象的放入session。
前面我们可以这样写
      <fieldset>
    	<legend>物料搜索</legend>
    	<form action="GoodsAction?type=selectSome" method="post">
    		物料名字:<input type="text" name='goodsName'  value="${condition['goodsName']} " />
    	          物料类型<input type="text" name="goodsType"  value="${condition['goodsType'] }"/><br/>
    	        <input type="submit"/>
    	          <hr/>
    	</form>
    </fieldset>
    <table border=1>
    	<tr>
    		<th>名字</th>
    		<th>数量</th>
    		<th>价格</th>
    		<th>类型</th>
    		<th>供应商</th>
    	</tr>
    	<c:forEach var ="temp" items="${page.list}">
			<tr>
				<td>${temp.name }</td>
				<td>${temp.count }</td>
				<td>${temp.price }</td>
				<td>${temp.type_id }</td>
				<td>${temp.provider_id}</td>
			</tr>    	
    	</c:forEach>
    </table>
	    <jsp:include page="../page.jsp">
    		<jsp:param value="GoodsAction" name="name"/>
    		<jsp:param value="selectSome" name="type"/>
    	</jsp:include>
---------------------------
后台
String pageNum = request.getParameter("pageNum");
		String goodsName = request.getParameter("goodsName");
		String goodsType = request.getParameter("goodsType");

		HttpSession session = request.getSession();
		Map<String, String> condition = (Map<String, String>) session.getAttribute("condition");
		if (condition == null) {
			condition = new HashMap<String, String>();
			session.setAttribute("condition", condition);
		}
		if (goodsName != null) {
			condition.put("goodsName", goodsName);
		}
		if (goodsType != null) {
			condition.put("goodsType", goodsType);
		}
		if (pageNum == null)
			pageNum = "1";

		PageInfo p = new PageInfo(Integer.parseInt(pageNum), 10, "t_s_goods");
		dao.getAll(p, condition);
		request.setAttribute("page", p);
		request.getRequestDispatcher("goods/goods_list.jsp").forward(request,response);
Global site tag (gtag.js) - Google Analytics