单向one-to-many 和 双向one-to-many

本文介绍了Hibernate中单向和双向的One-to-Many关系配置。单向One-to-Many关系允许从B表查询到A表的相关信息,而A表无法反向查询。在B表的映射文件中需要添加额外的配置。双向One-to-Many关系则允许双方互相查询关联信息,两个表的类中都包含外键属性,但外键仍位于B表中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、单向one-to-many

单向的one(A表)-to-many(B表)是A表的一条数据可对应B表的多条数据,能从B表中能对应查找出相关的A表中关联的信息,而A表不能查出关联B表中的的信息,一般情况下外键在B表中,只有在A表的***.hbm.xml中只需要添加类的属性,没有关联属性,B表的***.hbm.xml中除了添加类的属性,还要添加:

 <many-to-one name="B表的关联属性" class="A表的地址">
            <column name="B表的外键名" />
        </many-to-one>
例:

District.java(A表的创建类)

public class District {

	private Integer districtId;
	private String districtName;
	
	public Integer getDistrictId() {
		return districtId;
	}
	public void setDistrictId(Integer districtId) {
		this.districtId = districtId;
	}
	public String getDistrictName() {
		return districtName;
	}
	public void setDistrictName(String districtName) {
		this.districtName = districtName;
	}
	
	

}

Street.java(B表的创建类)

public class Street {

	private Integer streetId;
	private District district;
	private String streetName;

	public Integer getStreetId() {
		return streetId;
	}
	public void setStreetId(Integer streetId) {
		this.streetId = streetId;
	}
	public District getDistrict() {
		return district;
	}
	public void setDistrict(District district) {
		this.district = district;
	}
	public String getStreetName() {
		return streetName;
	}
	public void setStreetName(String streetName) {
		this.streetName = streetName;
	}
}
 

District.hbm.xml(A表的映射文件)

<hibernate-mapping>
    <class name="com.isoft.model.District" table="t_district" lazy="true">
        <id name="districtId" type="java.lang.Integer">
            <column name="t_district_id" />
            <generator class="assigned" />
        </id>
      
        <property name="districtName" type="java.lang.String">
            <column name="t_district_name" length="50" />
        </property>
    </class>
</hibernate-mapping>

Street.hbm.xml(B表的映射文件)
<hibernate-mapping>
    <class name="com.isoft.model.Street" table="t_street" lazy="true">
        <id name="streetId" type="java.lang.Integer">
            <column name="t_street_id"/>
            <generator class="assigned" />
        </id>
        <many-to-one name="district" class="com.isoft.model.District">
            <column name="t_district_id" />
        </many-to-one>
        <property name="streetName" type="java.lang.String">
            <column name="t_street_name" length="50" />
        </property>
    </class>
</hibernate-mapping>


二、双向one-to-many

           双向one(A表)-to-many(B表)是A表的一条数据可对应B表的多条数据,能从B表中能对应查找出相关的A表中关联的信息,而A表也能查出关联B表中的的信息。两个表的类中都有外键属性,但是表中的外键还在B表中。

A表中除了本类属性还要添加:

<set name="在A表类中定义的B表类的属性名">
            <key>
                <column name="B表的外键"/>
            </key>
            <one-to-many class="B表类的地址" />
</set>
B表中除了本类属性还要添加:

<many-to-one name="在B表类中定义A表的属性" class="A表类的地址" column="外键的列名"></many-to-one>
例:

TDepartment.java(A表的创建类)

public class TDepartment implements java.io.Serializable {

	private String TDepid;
	private String TDname;
	private Set<TEmployee> TEmployees = new HashSet<TEmployee>(0);
	public String getTDepid() {
		return TDepid;
	}
	public void setTDepid(String tDepid) {
		TDepid = tDepid;
	}
	public String getTDname() {
		return TDname;
	}
	public void setTDname(String tDname) {
		TDname = tDname;
	}
	public Set<TEmployee> getTEmployees() {
		return TEmployees;
	}
	public void setTEmployees(Set<TEmployee> tEmployees) {
		TEmployees = tEmployees;
	}
}

(B表的创建类)

public class TEmployee implements java.io.Serializable {

	private String TId;
	private TDepartment TDepartment;
	private String TName;
	public String getTId() {
		return TId;
	}
	public void setTId(String tId) {
		TId = tId;
	}
	public TDepartment getTDepartment() {
		return TDepartment;
	}
	public void setTDepartment(TDepartment tDepartment) {
		TDepartment = tDepartment;
	}
	public String getTName() {
		return TName;
	}
	public void setTName(String tName) {
		TName = tName;
	}
}

TDepartment.hbm.xml(A表的映射文件)

<hibernate-mapping>
    <class name="com.tjtc.test.TDepartment" table="t_department" catalog="shujuk">
        <id name="TDepid" type="string">
            <column name="t_depid" length="50" />
            <generator class="assigned" />
        </id>
        <property name="TDname" type="string">
            <column name="t_dname" length="50" />
        </property>
        <set name="TEmployees">//连接B表的外键实现双向
            <key>
                <column name="t_depid"/>
            </key>
            <one-to-many class="com.tjtc.test.TEmployee" />
        </set>
    </class>
</hibernate-mapping>

TEmployee.hbm.xml(B表的映射文件)
<hibernate-mapping>
    <class name="com.tjtc.test.TEmployee" table="t_employee" catalog="shujuk">
        <id name="TId" type="string">
            <column name="t_id" length="50" />
            <generator class="assigned" />
        </id>
        <many-to-one name="TDepartment" class="com.tjtc.test.TDepartment" column="t_depid">
      
        </many-to-one>
        <property name="TName" type="string">
            <column name="t_name" length="50" />
        </property>
    </class>
</hibernate-mapping>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值