Hibernate 单向多对一&单向一对多&单向多对多

纸上得来终觉浅

上篇是单向一对一,这篇是单向的其他方式; 顺便说一下 ”单向A对B“,指的就是A的那一方能够加载到B;

1.多对一就是多的那一方(A)能够加载另一方:

只需要在上篇文章中的单向外键一对一加载中去掉 uniqe属性即可:

<many-to-one name="teacher" column="teacherId" ></many-to-one>
这个时候teacherId这列的值是可以重复的

2.一对多

例如B(Teacher)拥有很多A(学生):

A正常(没有B属性),只在B中增加A属性:

package roadArchitectWeb;

import java.util.HashSet;
import java.util.Set;

public class Teacher {
	private Integer Id;
	private String Name;
	private String PhoneNum;
	private Set<Student> Students = new HashSet<>();

	public Set<Student> getStudents() {
		return Students;
	}
	public void setStudents(Set<Student> students) {
		Students = students;
	}
	public Integer getId() {
		return Id;
	}
	public void setId(Integer id) {
		Id = id;
	}
	public String getName() {
		return Name;
	}
	public void setName(String name) {
		Name = name;
	}
	public String getPhoneNum() {
		return PhoneNum;
	}
	public void setPhoneNum(String phoneNum) {
		PhoneNum = phoneNum;
	}
	public  Teacher() {
	}
	@Override
	public String toString() {
		return "Teacher [Id=" + Id + ", Name=" + Name + ", PhoneNum=" + PhoneNum + ", Students=" + Students + "]";
	}
}

A的配置文件也正常配置,B的配置文件改为:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-4-21 19:24:31 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="roadArchitectWeb.Teacher" table="TEACHER">
        <id name="Id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="native" />
        </id>
        <property name="Name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="PhoneNum" type="java.lang.String">
            <column name="PHONENUM" />
        </property>
<!--    name指本类中的属性,class对应哪一个类,table对应哪一个表格,column生成哪一个列作为外键; -->
        <set name="Students" table="STUDENT">
        <key column="teacherId"></key>
        <one-to-many class="roadArchitectWeb.Student"/>
        </set>
    </class>
</hibernate-mapping>
这种方式,其实就是在A中增加了一列,作为外键,和多对一的数据库实现是一样的,只是这个时候再B中增加了A属性,其实就是这种关联管理由B来管理,所以B能够加载到A

3.单向多对多

根据学习知道,单向多对多,就是A可以有多个B,B可以有多个A,单向就是一方能加载另一方,另一方不能加载己方。如B(Teacher)可以有多个A,A可以有多个B,B能够

加载到A,  只要把上述的一对多的B的配置文件改为如下即可“:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-4-21 19:24:31 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="roadArchitectWeb.Teacher" table="TEACHER">
        <id name="Id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="native" />
        </id>
        <property name="Name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="PhoneNum" type="java.lang.String">
            <column name="PHONENUM" />
        </property>
<!--    name指本类中的属性,table生成的关联表的名字,key column本类在关联表中的外键,many-to-many column
代表Student类在关联表中的外键 -->
        <set name="Students" table="Join_Table">
        <key column="teacherId"></key>
        <many-to-many column="StudentId"  class="roadArchitectWeb.Student"/>
        </set>
    </class>
</hibernate-mapping>
这种多对多单向关联其实是通过关联表“Join_Table”来维持A与B的关系,数据库会新增关联表”Join_Table“。

下篇讲双向关联。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值